分类 研发 下的文章

IoT
Internet of things 物联网

LPWAN
Low power wide area network 低功耗广域网

eMTC
Enhanced machine-type communication 增强型机器类型通信

GSM
Global system for mobile communication 全球移动通信系统
CDMA
Code division multiple access 码分多址
LTE
Long term evolution 长期演进

2G
2nd Generation 第二代移动通信
移动:GSM
电信:CDMA
联通:GSM

3G
移动:TD-SCDMA
电信:CDMA-2000
联通:W-CDMA

4G
移动:TD-LTE
电信:TD-LTE+FDD-LTE
联通:TD-LTE+FDD-LTE

5G
目前有2个FR(Frequency Range 频率范围)
目前运营商FR1分配:
移动:2.515GHz-2.675GHz共160MHz,频段号为n41,以及4.8GHz-4.9GHz共100MHz,频段号为n79;
中国电信:3.4GHz-3.5GHz共100MHz,频段号为n78;
中国联通:3.5GHz-3.6GHz共100MHz,频段号为n78;
特点:频率高、带宽大、穿透能力弱

NB-IoT
Narrow band internet of things 窄带物联网

NB-IoT 窄带物联网.txt

1 ftplib报错
ftplib 'latin-1' codec can't encode characters
解决方法:
找到引用的ftplib.py
将encoding ='latin-1'改为encoding ='utf-8'

2 打包exe
pycharm→file→settings→project→interpreter
增加pyinstall
view→tool→terminal
pyinstaller -F -w main.py

3 Failed to execute
配置项在配置文件中
由于是2exe后执行文件路径变更,需要将app.conf拷贝到exe所在文件夹

4 python源码

# python是一门解释性语言,由于需要解释器,所以在运行的时候需要安装运行环境
# 目前IDE选择的是jetbrains的pycharm,主要是因为较简单地实现了venv的虚拟运行环境,不会与系统本身的python环境冲突
# 如果要在windows中使用,建议打包成为exe的可执行文件
# pycharm→file→settings→project→interpreter,增加pyinstall,然后view→tool→terminal,执行pyinstaller -F -w main.py
# 如果打包后运行exe出现Failed to execute,由于是2exe后执行文件路径变更,需要将app.conf拷贝到exe所在文件夹
# 如果调试时报错ftplib 'latin-1' codec can't encode characters,找到引用的ftplib.py,将encoding ='latin-1'改为encoding ='utf-8'
import os  # 导入系统包,主要用于路径的获取,文件的读写
import configparser  # 把路径和ftp都放到了配置文件,以后好更改
import ftplib  # 导入ftp相关的包

conf = configparser.ConfigParser()  # 实例化配置文件


def read_conf(option):
    """
    定义了一个读取文件的方法,需要传参option
    :param option:config文件中有section分类和option值,这里配置项较为简单,全部放入一个section中,只传参option值即可
    :return:返回值,调用这个方法后,会返回配置文件中的配置项
    Python不是静态类型语言,也不属于标准的强类型语言,所有返回值的类型需要注意
    """
    base_dir = os.path.abspath(os.path.dirname(__file__))  # 获取项目的绝对路径
    conf.read(base_dir + '/app.conf')  # config文件路径
    cinfig_option = conf.get("config", option)  # 获取指定section 的option值
    return cinfig_option


loacl_path = read_conf("loacl_path")  # 获取FTP服务器地址
ftp_ip = read_conf("ftp_ip")  # 获取FTP用户名
ftp_user = read_conf("ftp_user")  # 获取FTP密码
ftp_pass = read_conf("ftp_pass")  # 获取本地文件夹目录
ftp_path = read_conf("ftp_path")  # 获取ftp备份目录
session = ftplib.FTP(host=ftp_ip, user=ftp_user, passwd=ftp_pass)  # 实例化ftp连接


def upload_dir(path_source, session, target_dir=None):
    files = os.listdir(path_source)  # 返回指定的文件夹包含的文件或文件夹的名字的列表
    last_dir = os.path.abspath(loacl_path)  # 先记住之前在哪个工作目录中
    os.chdir(path_source)  # 然后切换到目标工作目录
    if target_dir:
        current_dir = session.pwd()  # 获取ftp的当前路径
        try:
            session.mkd(target_dir)  # 穿件备份文件夹
        except Exception as e:
            pass  # 属于偷懒,先try,报错才到except,一般会写成except Exception as e,然后print(e),逐步缩小异常类型排查错误
        finally:
            session.cwd(os.path.join(current_dir, target_dir))  # 拼接当前路径和备份文件夹,并切换到该路径
    for file_name in files:  # for循环遍历files列表中的文件
        current_dir = session.pwd()  # 获取ftp的当前路径
        if os.path.isfile(path_source + r'/{}'.format(file_name)):  # 调用os判断是文件还是目录,
            upload_file(path_source, file_name, session, current_dir)  # 如果是文件就执行后面定义的upload_file方法
        elif os.path.isdir(path_source + r'/{}'.format(file_name)):  # 如果是目录
            current_dir = session.pwd()  # 获取当前ftp目录
            try:
                session.mkd(file_name)  # 尝试新建目录
            except:
                pass
            session.cwd("%s/%s" % (current_dir, file_name))  # 切换到新建的目录
            # 递归调用了自己这个方法本身,然后target_dir未传参,所以会一直到文件夹中不含子文件夹才停止
            upload_dir(path_source + r'/{}'.format(file_name), session)
        session.cwd(current_dir)  # 之前路径可能已经变更,需要再回复到之前的路径里
    os.chdir(last_dir)  # 切换到进入方法之前记录的最后的路径,以免递归调用时出错


def upload_file(path, file_name, session, target_dir, callback=None):
    cur_dir = session.pwd()  # 记录当前 ftp 路径
    if target_dir:
        try:  # 存在指定路径 就先创建
            session.mkd(target_dir)
        except:
            pass
        finally:
            session.cwd(os.path.join(cur_dir, target_dir))  # 切换到指定路径
    print("path:%s \r\n\t   file_name:%s" % (path, file_name))  # 打印路径和文件信息
    file = open(os.path.join(path, file_name), 'rb')  # 要上传的文件
    session.storbinary('STOR %s' % file_name, file, callback=callback)  # 文件上传
    file.close()  # 关闭连接
    session.cwd(cur_dir)  # 切换回初始目录


upload_dir(loacl_path, session, ftp_path)  # 执行之前定义的文件夹上传的方法

python打包exe文件备份本地目录到远程FTP.txt

1. 安装python3
https://code.ziqiangxuetang.com/django/django-basic.html
sudo yum install python3 -y

2. 安装django
sudo pip3 install Django

3. 创建一个项目
django-admin.py startproject www

4. 目录说明:
www: 项目的容器。
manage.py: 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。
www/__init__.py: 一个空文件,告诉 Python 该目录是一个 Python 包。
www/settings.py: 该 Django 项目的设置/配置。
www/urls.py: 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。
www/wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。

5. 启动服务器
python3 manage.py runserver 0.0.0.0:8000

6. 处理DisallowedHost
vim www/settings.py
ALLOWED_HOSTS = ['*']

7. 查看命令
python3 manage.py

8. 创建一个应用/app
python3 manage.py startapp huchangyi

9. 新定义的app加入到settings.py中的INSTALL_APPS中
自动找到app中的模板文件(app-name/templates/下的文件)和静态文件(app-name/static/中的文件) 
vim www/settings.py

10. 定义视图函数
vim huchangyi/views.py

# coding:utf-8
from django.http import HttpResponse

def index(request):
    return HttpResponse(u"胡昌意")

11. 定义视图函数相关的URL
vim www/urls.py

from huchangyi import views as huchangyi_views  # new

urlpatterns = [
    path('', huchangyi_views.index),
    path('admin/', admin.site.urls),
]

13. 新建测试目录
pwd:Print working directory
mkdir make directory

12. 实现上传下载
https://www.cnblogs.com/dreamer-fish/p/5948428.html
views:
def mgmt_files(request): #列出树形目录,上传文件页面
    if request.method == 'POST':
        path_root = "D:\\py\\ITFiles" #上传文件的主目录
        myFile =request.FILES.get("file", None)    # 获取上传的文件,如果没有文件,则默认为None  
        if not myFile:  
            dstatus = "请选择需要上传的文件!"
        else:
            path_ostype = os.path.join(path_root,request.POST.get("ostype"))
            path_dst_file = os.path.join(path_ostype,myFile.name)
            # print path_dst_file
            if os.path.isfile(path_dst_file):
                dstatus = "%s 已存在!"%(myFile.name)
            else:
                destination = open(path_dst_file,'wb+')    # 打开特定的文件进行二进制的写操作  
                for chunk in myFile.chunks():      # 分块写入文件  
                    destination.write(chunk)  
                destination.close()  
                dstatus = "%s 上传成功!"%(myFile.name)
        return HttpResponse(str(dstatus))

    return render(request,'sinfors/mgmt_files.html')


def mgmt_file_download(request,*args,**kwargs): #提供文件下载页面
    #定义文件分块下载函数 
    def file_iterator(file_name, chunk_size=512):
        with open(file_name,'rb') as f: #如果不加‘rb’以二进制方式打开,文件流中遇到特殊字符会终止下载,下载下来的文件不完整
            while True:
                c = f.read(chunk_size)
                if c:
                    yield c
                else:
                    break

    path_root = "D:\\py\\ITFiles"
    if kwargs['fpath'] is not None and kwargs['fname'] is not None:
        file_fpath = os.path.join(path_root,kwargs['fpath']) #kwargs['fapth']是文件的上一级目录名称
        file_dstpath = os.path.join(file_fpath,kwargs['fname']) #kwargs['fname']是文件名称

        response = StreamingHttpResponse(file_iterator(file_dstpath))
        response['Content-Type'] = 'application/octet-stream'
        response['Content-Disposition'] = 'attachment;filename="{0}"'.format(kwargs['fname']) #此处kwargs['fname']是要下载的文件的文件名称
        return response

Django部署教程.txt