精华内容
下载资源
问答
  • pycharm远程连接linux系统,进行程序调试的时候,出现自定义模块的导入错误, No module named xxxx 采取措施: 1. 将项目路径加入~/.bashrc 文件中,如果没有解决问题,继续往下  2.查看pycharm中的Run/...

    pycharm远程连接linux系统,进行程序调试的时候,出现自定义模块的导入错误,

    No module named xxxx

    采取措施:  1. 将项目路径加入到~/.bashrc 文件中,如果没有解决问题,继续往下

                         2.查看pycharm中的Run/Debug  Configuration中Enviroment variables中变量,将PYTHONPATH填写上。

     

    基本上所有的自定义模块的远程调试错误都可以用第二步的方法解决。

    展开全文
  • 51单片机通过WIFI模块ESP8266控制LED灯

    万次阅读 多人点赞 2018-06-16 18:47:40
    手机APP通过ESP8266 WIFI模块与51单片机通信控制LED灯的开关。下位机由单片机、ESP8266模块和LED灯组成,上位机由Android手机APP承担。我们在APP上发送LED灯的开关控制指令,ESP8266将收到的数据发送给单片机,从而...

    完整源码下载地址:https://download.csdn.net/download/tongxin082/21440621

    一、系统方案

    手机APP通过ESP8266 WIFI模块与51单片机通信控制LED灯的开关。下位机由单片机、ESP8266模块和LED灯组成,上位机由Android手机APP承担。我们在APP上发送LED灯的开关控制指令,ESP8266将收到的数据发送给单片机,从而实现对LED灯进行开关控制。

    设计好的实物是这个样子:

    二、硬件设计

    ESP8266模块作为一个透传模块使用,RXD、TXD分别连接51单片机的TXD和RXD,VCC和CH_PD管脚接3.3V电压,GND接地,只需要连接这些管脚,ESP8266模块就可以正常工作了。在单片机P2口上连接了三个5mm的LED灯,分别是红黄蓝三种颜色,我们的目的是通过手机APP上的开关控制着三个LED灯的亮灭。

    ESP8266实物管脚图

    三、单片机软件设计

    硬件的连接不复杂,接下来主要是单片机和手机APP代码的编写。

    单片机代码主要是串口初始化、串口中断和ESP8266的初始化。首先是串口初始化:

            TMOD=0x20;		//定时器1工作在方式2
    	TH1 = 0xfd;		//波特率9600
    	TL1 = 0xfd;
    	SM0=0;                  //串口工作在方式1
    	SM1=1;
    	EA = 1;			//开总中断
    	REN = 1;		//使能串口
    	TR1 = 1;		//定时器1开始计时

    然后是ESP8266初始化:

            delayms(1000);                        //延时
    	sendString("AT+CWMODE=2\r\n");        //设置ESP8266工作在AP模式下
    	delayms(1000);	
    	sendString("AT+CIPMUX=1\r\n");        //允许多连接
    	delayms(1000);	
    	sendString("AT+CIPSERVER=1\r\n");     //建立服务器
    	delayms(1000);	
    	ES = 1;				      //esp8266初始化之后开串口中断

    贴上51单片机负责串口发送的两个函数:

    //发送一个字节
    void sendChar(uchar a)
    {
    	SBUF = a;
    	while(TI==0);
    	TI=0;
    	
    }
    
    //发送字符串
    void sendString(uchar *s)
    {
    	while(*s!='\0')
    	{
    		sendChar(*s);
    		s++;
    	}
    		
    }

    在串口中断中处理接收到的数据:

    1:打开红色灯    2:关闭红色灯

    3:打开黄色灯    4:关闭黄色灯

    5:打开蓝色灯    6:关闭蓝色灯

    esp8266在收到数据并转发给单片机时的数据格式:+IPD,<client号>,<收到的字符长度>:收到的字符,比如+IPD,0,5:hello,其中+PID是固定的;0代表的是TCP客户端编号,esp8266最多支持5个客户端同时连接,也就是说客户端编号是0到4,在本设计中由于只有一个客户端与esp8266相连,所以客户端编号是0;5代表收到的字符长度;hello是收到的字符。在本例中esp8266发送给单片机的数据是+IPD,0,1:1,我们把接收到的字符串缓存到字符数组中,所以在处理收到的数据逻辑中,首先判断是否是以'+'开始的,否则视作无效数据,然后判断数组中的第十个数据,因为第十个数据才是上位机发送过来的数据。

    void uart() interrupt 4
    {
        if(RI == 1)   
        {
            RI = 0;     //清除串口接收标志位
    	receiveTable[i]=SBUF;
    	if(receiveTable[0]=='+')
    	{
    		i++;
    	}
    	else
    	{
    		i=0;
    	}
    	if(i==10)
    	{
    		i=0;
    		switch(receiveTable[9])
    		{
    			case '1':
    				RedLED=0;
    				break;
    			case '2':
    				RedLED=1;
    				break;
    			case '3':
    				YellowLED=0;
    				break;
    			case '4':
    				YellowLED=1;
    				break;
    			case '5':
    				BlueLED=0;
    				break;
    			case '6':
    				BlueLED=1;
    				break;
    		}
    	}
        
      }
    }

    四、Android APP软件设计

    Android APP是借助Android Studio来开发的,界面比较简单,通过编辑框输入esp8266的IP地址和端口号,esp8266默认的IP地址是192.168.4.1,端口号是333,这些都可以通过AT指令进行修改。布局页面的xml代码我们就不贴了,熟悉Android开发的读者很快就能根据截图编写出来,放上一个APP界面的截图:

    我们主要看一下逻辑代码部分:

    首先是控件的初始化和按钮点击事件回调的绑定

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mBtnConnect = (Button) findViewById(R.id.btn_connect);
            mEtIP = (EditText) findViewById(R.id.et_ip);
            mEtPort = (EditText) findViewById(R.id.et_port);
            mBtnRedOn = (Button) findViewById(R.id.btn_red_on);
            mBtnRedOff = (Button) findViewById(R.id.btn_red_off);
            mBtnYellowOn = (Button) findViewById(R.id.btn_yellow_on);
            mBtnYellowOff = (Button) findViewById(R.id.btn_yellow_off);
            mBtnBlueOn = (Button) findViewById(R.id.btn_blue_on);
            mBtnBlueOff = (Button) findViewById(R.id.btn_blue_off);
            mBtnConnect.setOnClickListener(this);
            mBtnRedOn.setOnClickListener(this);
            mBtnRedOff.setOnClickListener(this);
            mBtnYellowOn.setOnClickListener(this);
            mBtnYellowOff.setOnClickListener(this);
            mBtnBlueOn.setOnClickListener(this);
            mBtnBlueOff.setOnClickListener(this);
    
        }

    按钮的点击回调方法:

        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_connect:
                    //连接
                    if (mSocket == null || !mSocket.isConnected()) {
                        String ip = mEtIP.getText().toString();
                        int port = Integer.valueOf(mEtPort.getText().toString());
                        mConnectThread = new ConnectThread(ip, port);
                        mConnectThread.start();
                    }
                    if (mSocket != null && mSocket.isConnected()) {
                        try {
                            mSocket.close();
                            mBtnConnect.setText("连接");
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
    
                    break;
                case R.id.btn_red_on:         //开红灯
                    if (out != null) {
                        out.print("1");
                        out.flush();
                    }
                    break;
                case R.id.btn_red_off:        //关红灯
                    if (out != null) {
                        out.print("2");
                        out.flush();
                    }
                    break;
                case R.id.btn_yellow_on:
                    if (out != null) {
                        out.print("3");
                        out.flush();
                    }
                    break;
                case R.id.btn_yellow_off:
                    if (out != null) {
                        out.print("4");
                        out.flush();
                    }
                    break;
                case R.id.btn_blue_on:
                    if (out != null) {
                        out.print("5");
                        out.flush();
                    }
                    break;
                case R.id.btn_blue_off:
                    if (out != null) {
                        out.print("6");
                        out.flush();
                    }
                    break;
            }
        }
     

    负责连接esp8266的线程:

    private class ConnectThread extends Thread {
            private String ip;
            private int port;
    
            public ConnectThread(String ip, int port) {
                this.ip = ip;
                this.port = port;
            }
    
            @Override
            public void run() {
                try {
                    mSocket = new Socket(ip, port);
                    out = new PrintStream(mSocket.getOutputStream());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mBtnConnect.setText("断开");
                        }
                    });
                    new HeartBeatThread().start();
                } catch (IOException e) {
                    e.printStackTrace();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "连接失败", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            }
        }

    完整源码下载地址:https://download.csdn.net/download/tongxin082/21440621

    本文完!

    展开全文
  • NBIOT模块学习总结

    万次阅读 多人点赞 2018-08-15 10:58:15
    一、NBIOT网络架构 这里使用华为开发者社区提供的信息...2)UE与IoT云平台之间:一般使用CoAP/MQTT等物联网专用的应用层协议进行通信,主要是考虑了NB-IoT UE的硬件资源配置一般很低,适合使用HTTP/HTTPs等复杂...

    一、NBIOT网络架构
    这里写图片描述
    这里使用华为开发者社区提供的信息来看NB-IoT端到端架构全貌。
    1)UE(终端)与eNB/EPC(基站)之间:基于NB-IoT技术进行通信,分为AS和NAS,这部分基本完全由芯片实现。
    2)UE与IoT云平台之间:一般使用CoAP/MQTT等物联网专用的应用层协议进行通信,主要是考虑了NB-IoT UE的硬件资源配置一般很低,不适合使用HTTP/HTTPs等复杂的协议。
    3)IoT云平台与第三方应用服务器之间:由于两者的性能都很强大,且要考虑带宽、安全等诸多方面,因此一般会HTTPs/HTTP等应用层协议进行通信。
    二、NBIOT模块工作模式
    NBIOT模块默认有三种工作状态如下:
    1. Connected(连接态)
    模块注册入网后处于该状态,可以发送和接收数据,无数据交互超过一段时间后会进入Idle模式,时间可配置。
    2. Idle(空闲态)
    可收发数据,且接收下行数据会进入Connected状态,无数据交互超过一段时会进入PSM模式,时间可配置。空闲状态可配置执行DRX或eDRX模式。

    这里写图片描述
    DRX:discontinuous reception,不连续接收模式。对下行业务时延要求高,如路灯。
    这里写图片描述
    eDRX:Extended idle mode DRX,扩展不连续接收模式。对下行业务时延有较高要求,可根据设备是否处于休眠状态缓存消息或者立即下发消息,如智能穿戴设备。
    3. PSM(节能模式)
    此模式下终端关闭收发信号机,不监听无线侧的寻呼,因此虽然依旧注册在网络,但信令不可达,无法收到下行数据,功率很小。
    持续时间由核心网配置(T3412),有上行数据需要传输或TAU周期结束时会进入Connected态。
    NB-IoT三种工作状态一般情况的转换过程可以总结如下:
    1) 终端发送数据完毕处于Connected态,启动“不活动计时器”,默认20秒,可配置范围为1s~3600s;
    2) “不活动计时器”超时,终端进入Idle态,启动活动定时器(Active-Timer【T3324】),超时时间配置范围为2秒~186分钟;
    3) Active-Timer超时,终端进入PSM状态,在此状态中,终端不进行寻呼,不接受下行数据,处于休眠状态,当终端处于PSM态时,也可以通过主动发送上行数据令终端回到激活态;
    4)TAU Timer从终端进入空闲态时便开始计时,TAU周期结束时进入Connected态,TAU周期【T3412】配置范围为54分钟~310小时。
    三、AT指令
    NB-IoT的中文指令集,基于BC95 657 SP2版本翻译的。
    ——————————————————————
    AT 命令 描述 实现的状态
    3GPP Commands (27.007)
    AT+CGMI 查询制造商 ID B350+
    AT+CGMM 查询模块型号 B350+
    AT+CGMR 查询固件版本 B350+
    AT+CGSN 查询模块序列号 B350+
    AT+CEREG 查询网络注册状态 B350+
    AT+CSCON 查询信号连接状态 B350+
    AT+CLAC 列出可用命令 B350+
    AT+CSQ 获取信号强度 B350+
    AT+CGPADDR 显示 PDP 地址 B350+
    AT+COPS 选择接入的网络 B350+
    AT+CGATT PS 连接或分离 B350+
    AT+CGACT 激活或停用 PDP 上下文 B657SP1+
    AT+CIMI 查询国际移动设备身份码 B350+
    AT+CGDCONT 定义一个 PDP 上下文 B350+
    AT+CFUN 设置终端功能 B350+
    AT+CMEE 报告移动终端错误 B600+
    AT+CCLK 返回当前日期和时间 B656+
    AT+CPSMS 省电模式设置 B657SP1+
    AT+CEDRXS eDRX 设置 B657SP1+
    AT+CEER 扩展错误报告 B657SP1+
    AT+CEDRXRDP eDRX 阅读动态参数 B657SP1+
    AT+CTZR 时区报告 B657SP1+
    ETSI Commands(正在开发中)
    AT+CSMS 选择短消息服务 B657SP1+
    AT+CNMA 模块消息提醒 B657SP1+
    AT+CSCA 服务中心地址 B657SP1+
    AT+CMGS 发送短消息 B657SP1+
    AT+CMGC 发送短信命令 B657SP1+
    AT+CSODCP 通过控制层发送原始数据 B657SP1+
    AT+CRTDCP 通过控制层传送终端数据 B657SP1+
    General Commands 通用命令
    AT+NMGS 发送消息到 CDP 服务器 B350+
    AT+NMGR 接收 CDP 服务器消息 B350+
    AT+NNMI 接收消息标志 B350+
    AT+NSMI 发送消息的标志 B350+
    AT+NQMGR 查询接收到的消息量 B350+
    AT+NQMGS 查询发送的消息量 B350+
    AT+NMSTATUS 信息注册状态 B657SP1+
    AT+NRB 模块重启 B350+
    AT+NCDP 配置和查询 CDP 服务器设置 B350+
    AT+NUESTATS 获取的操作统计 B350+
    AT+NEARFCN 指定搜素频率 B350+
    AT+NSOCR 创建 Socket B350+
    AT+NSOST 发送数据 B350+
    AT+NSOSTF 发送有标记数据 B656+
    AT+NSORF 接收命令 B350+
    AT+NSOCL 关闭 Socket B350+
    +NSONMI 指示 Socket 消息到达(只响应) B350+
    AT+NPING 测试 IP 网络连接到远程主机 B350+
    AT+NBAND 设置频段 B600+
    AT+NLOGLEVEL 设置日志级别 B600+
    AT+NCONFIG 配置模块的功能 B650+
    AT+NATSPEED 配置 UART 端口波特率 B656+
    AT+NCCID 卡片识别 B657SP1+
    AT+NFWUPD 通过 UART 更新固件 B657SP1+
    AT+NRDCTRL 控制无线配置 B657SP1+
    AT+NCHIPINFO 读取系统信息 B657SP1+
    Temporary Commands 临时命令
    四、NBIOT的联网过程
    这里写图片描述
    NB模组UDP数据发送

    1)开机/重启,模块已经正常启动;
    2)AT+NBAND? 查看当前频段信息,确定是否和模块型号对应;
    3)AT+NBAND=5 电信模块,设置频段为850MHZ;
    4)AT+NRB 重启模块;
    5)AT+NBAND? 再次查询模块频段信息,确认设置成功;
    6)AT+NCONFIG? 查询配置信息,主要包括自动连接使能配置信息,默认使能;
    7)AT+CFUN? 模块是否处于全工作模式,打开射频电路,搜索信号,如果返回0,请确定AUTOCONNECT值是否为TRUE,以及是否安装NBIOT专用SIM卡;
    8)AT+CIMI 查询IMSI信息,如果返回具体数值,说明已经正常识别SIM卡;
    9)AT+CSQ 查询信号强度,返回的第一个数值代表信号强度,0-31代表有信号,数值越大信号越强,99代表没有NBIOT网络信号,第二个参数还没有实施,一直为99;
    10)AT+NUESTATS 查询模块状态;
    11)AT+CGATT? 查询是否模块附着成功,返回1代表成功;
    12)AT+CEREG? 查询网络注册状态,第二个数值返回1代表:网络注册成功,返回2代表:正在注册网络,注册时间和信号强度有关;
    13)AT+CSCON? 查看模块工作的连接状态,第二个返回数值代表模块的工作状态,1代表CONNECT连接状态,0代表IDLE睡眠状态,如果没有数据交互,在CONNECT状态持续20秒,之后进入IDLE状态;如果仍然没有数据交互,10秒之后从IDLE状态进入PSM深度睡眠状态,此时模块不在接收任何下行数据,如果需要下行传输数据必须在CONNECT 和 IDLE状态下进行;
    14)AT+NSOCR=DGRAM,17,5683,1 创建UDP SOCKET 传输信道,DGRAM和17固定,5683代表本地端口号,1代表使能接收下行数据;最多可创建7个SOCKET传输信道,返回数值代表信号ID号,在发送和接收数据时需要指定;
    15)AT+NSOST=0,…,####,3,303132 发送UDP数据,0代表UDP SOCKET信道ID,…代表远程服务器的IP地址(公网IP地址),####代表远程服务器端口号,3代表发送的字符个数(发送了3个字符),303132代表“012”3个hex表示的字符;返回值代表成功从0信道发送了3个字节的数据(我这里测试发送了74个字节);
    16)+NSONMI:0,67 信息代表模块接收到新的数据,需要读取,如果不及时读取,接收到下一条数据,将不会主动上报该信息;但可以连续读取;0代表 UDP SOKECT信道,67代表有67个字节数据需要读取;
    17)AT+NSORF=0,3 读取数据;0代表UDP SOCKET 信道,3代表需要读取数据字节长度;需要从返回值中提取出有效数据303132,代表字符“012”;
    18)AT+NSOCL=0 关闭UDP SOCKET 传输信道;
    五、NBIOT的数据收发过程

    展开全文
  • 上篇已经介绍了如何搭建环境,这篇就讨论如何在 `A9G` 模块上实现定位获取经纬度以及把经纬度通过`MQTT`协议连接的推送到服务器

    • 本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。

    1、 如何在windows10上环境搭建,编译烧录代码固件,查看运行日志。

    2、 GPS模块如何定位经纬度并且上报到MQTT服务器,实现远程查看模块的经纬度。



    在这里插入图片描述


    一、小项目简介;


         这个小diy项目是空闲时候做出来的,而且准备开源出来,主要功能是实现 在微信小程序上地图定位显示该 GPS模块的信息,想想都刺激啊!!

         先上图,再解释一波:


    全部开源(微信端和硬件端):

         关注博文最下面的本人微信号二维码,回复 190828 即可获取本开源工程全部源码​!


         下面是实现原理:

    1. 采用安信可模块 A9G的开发板作为调试硬件,因为它支持 SDK 开发,插着中国移动的2G卡,再插着 GPS模块,可以实现全球定位;
    2. A9G模块可以实现MQTT协议连接,这个也是非常得意的,而且新版SDK支持重连机制;官网的SDK包有很多好玩的demo;
    3. A9G模块上面那个二维码是 IMEI信息,因此我用它作为我们与服务器通讯的主题设置;
    4. MQTT服务器我是自己搭建的,大家可以到我前面的博文参考怎么搭建。当然了,后面我会教大家使用阿里云物联网来实现;
    5. A9G模块定位的GPS出来的定位坐标系不是微信小程序的内置地图的坐标系,所以,需要进一步转换,而我使用依然是腾讯地图的开发服务,这个我后面会详细讲;
    6. 具体的通讯协议和睬坑记录都会在这个博文连载中一一为大家讲述;

    二、前言;


        上篇已经介绍了如何搭建环境,这篇就讨论如何在 A9G 模块上实现定位获取经纬度以及把经纬度通过MQTT协议连接的推送到服务器;

         玩得再好,也是参考官方的Demo来改动的;

         那么我们就开刀分析官网的工程,在 demo/gpsdemo/mqtt 这2个工程;


    三、GPS工程分析;


         大致概述下这个工程的流程:GPS定位成功后,可以通过串口配置 发送close来不再获取定位信息,发送 open 从而获取定位信息;


         和 rtos 操作系统使用几乎一样,都是通过创建任务来做业务逻辑;

    1. 先创建主任务 gps_MainTask ,里面是个串口配置,又创建一个新任务专门读取 gps 信息。
    2. 而剩下是不断等待死循环读取 系统的信息,这个貌似被封装过的;
    3. 当系统信息回调 API_EVENT_ID_NETWORK_REGISTERED_HOMEAPI_EVENT_ID_NETWORK_REGISTERED_ROAMING 的时候,就判断是 gprs 注册成功了!
    4. 然后打开 gps 定位,等待系统回复经纬度,当 API_EVENT_ID_GPS_UART_RECEIVED就可以触发经纬度数据处理了;

         我们烧录之后,过滤日志 MMI 01看看这个过程;

    在这里插入图片描述

         过滤日志 MMI 02看看这个经纬度?一开始以为这个是定位成功的,但是去官网文档提到这个是未成功定位!!我们可以把这个经纬度去查询下,竟然是 腾讯微信总部 ,what ?这个显然是错误的;

    GPS fix mode:1, BDS fix mode:1, fix quality:0, satellites tracked:0, gps sates total:0
      , is fixed:no fix, coordinate:WGS84
       , Latitude:22.589937, Longitude:113.227693
        , unit:degree,altitude:0.000000
    

         我不服, 我再等待几分钟,因为现在 gps定位比较慢,而且我是室内开发,我弄长点数据线放窗口,果然,不一会,就出现不一样的结果(由于个人隐私下面经纬度经过处理):

    GPS fix mode:3, BDS fix mode:3, fix quality:1, satellites tracked:6
    , gps sates total:12, is fixed:3D fix, coordinate:WGS84
    , Latitude:xxxx, Longitude:xxxx, unit:degree,altitude:0.000000
    

         所以,总结,只要 is fixed的内容不是 no fix,就是定位成功了!下面信息可以看到!
    在这里插入图片描述


        然后,我们就可以拿这个经纬度去某网站传送门查询下,确实是这个模块的地址;

    在这里插入图片描述


    四、MQTT工程分析;


         MQTT作为当前热火朝天的物联网通讯协议,想必哪个能联网的模块都可支持;

         程序上都是先判断网络注册成功之后,才可以做mqtt的事情;

         尤其注意,这里获取IMEI作为连接的client_id ,也就是模块那个二维码信息就是模块的IMEI

         当你成功连接服务器之后,发现定时不断地发送某消息到服务器,因为它这里有个延时发送:OS_StartCallbackTimer()

       MQTT_Event_t* event=NULL;
    
       //等待网络初始化成功才可以做mqtt的事情
        semMqttStart = OS_CreateSemaphore(0);
        OS_WaitForSemaphore(semMqttStart,OS_WAIT_FOREVER);
        OS_DeleteSemaphore(semMqttStart);
        semMqttStart = NULL;
        Trace(1,"start mqtt test");
       //这里获取IMEI作为连接的client_id 
        INFO_GetIMEI(imei);
        Trace(1,"IMEI:%s",imei);
        MQTT_Client_t* client = MQTT_ClientNew();
        
        MQTT_Error_t err;
        memset(&ci,0,sizeof(MQTT_Connect_Info_t));
        ci.client_id = imei;
        ci.client_user = CLIENT_USER;
        ci.client_pass = CLIENT_PASS;
        ci.keep_alive = 20;
        ci.clean_session = 1;
        ci.use_ssl = false;
        ci.will_qos = 2;
        ci.will_topic = "will";
        ci.will_retain = 1;
        memcpy(strstr(willMsg,"GPRS")+5,imei,15);
        ci.will_msg = willMsg;
    
        err = MQTT_Connect(client,BROKER_IP,BROKER_PORT,OnMqttConnection,NULL,&ci);
        if(err != MQTT_ERROR_NONE)
            Trace(1,"MQTT connect fail,error code:%d",err);
    

    • 总的来说,我们只要基于这个 MQTT 工程修改增加我们的 gps定位代码就可以了!

    五、MQTT与GPS整合一起;


         我们主要只是得到经纬度信息罢了,所以,我们把它组装成 json 格式,变成全局变量;以后上报信息就报这个就好啦;

    sprintf(postDate, "{\"IsFix\":\"%s\",\"Lat\":%lf,\"Lon\":%lf}", isFixedStr, latitude, longitude);
    

         这里我们自定义我们的订阅和发布的主题,下篇我会详细讲下我这项目定的通讯协议,目前先上代码:

    1. 获取imei。
    2. 把imei拼接成发布和订阅主题

        INFO_GetIMEI(imei); // 获取imei
        sprintf(subTopic, "/A9g/%s/get", imei); //设备端订阅的主题
        sprintf(pubTopic, "/A9g/%s/update", imei); //设备端发布的主题
        Trace(1, "subTopic: %s", subTopic); //打印下
        Trace(1, "pubTopic: %s", pubTopic);//打印下
    

    • 发布消息:我们把上面拼接好的数据 postDate 放进 MQTT_Publish()函数里面就可以啦!当调用 StartTimerPublish()函数就是发布函数,延迟时间自己可以定;
    • 那么我们应该在哪发布呢?首先:你连接成功服务器之后,你得发布一次把?再者,服务器请求经纬度,你也得发布一次把?
        //向MQTT服务器(broker)发布消息
        //client:MQTT客户端对象
        // topic:主题
        // port:服务器端口
        // payload:消息体
        // payloadLen:消息体长度
        // dup:标示发送重复数
        // qos:服务质量
        // retain:需要服务器持久保存消息
        // callback:发布请求回调函数
        // arg:需要传递给回调函数的参数
        err = MQTT_Publish(client, pubTopic, postDate, strlen(postDate), 1, 2, 0, OnPublish, NULL);
    
    

    • 每次上电,我们在 MQTT 后台查看,就有消息上报啦!

    在这里插入图片描述


    六、参考资料和个人仓库介绍;


        参考资料:

        因为官网的代码开源仓库,在拉取时候总会出现小问题,初学者可以拉取我的仓库,我的是同步官网最新的,不用担心是否新版代码;

    1. 下载代码

    git clone --recursive https://github.com/xuhongv/GPRS_A9G
    

    2. 检查代码完整性

    下载完后请检查目录platform/csdk目录写是否包含debugrelease目录。如果没有,则是下载方式错误,请仔细阅读第一步下载正确的文件!

    3. 搭建编译环境

    请移步到官网文档搭建,或者参考我这博文:传送门

    4. 编译工程

    本仓库包含有官网的demo和我写的demo工程;

    编译官方demo步骤:比如编译这个 gpio ,可以cd 到本工程目录,然后:

     ./build.bat demo gpio
    

    编译我写的demo步骤:比如编译这个我分析的这个 微信小程序追踪器 ,可以cd 到本工程目录,然后:

     ./build.bat mycode mini_tracer
    

    七、其他;


    另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!

    • 玩转esp8266带你飞、加群付费QQ群,不喜的朋友勿喷勿加:434878850
    • esp8266源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
    • esp32源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32
    • 邮箱联系或者加群联系我,就可以啦!
    展开全文
  • 解决方案:在服务器和客户机上都进行以下操作: 1.1. 打开注册表,快捷输入"regedit" 1.2. 找到文件夹路径[HKEY_LOCAL_MACHINE]\Software\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameter...
  • VIA 提供程序: 找不到指定的模块

    千次阅读 2011-12-11 22:54:16
    VIA 提供程序: 找不到指定的模块。 Sqlcmd: 错误: Microsoft SQL Native Client : 建立到服务器的连接时发生错误。连接到  SQL Server 2005 时,默认设置 SQL Server 不允许远程连接这个事实可能会导致失败。 。...
  • 测试4G模块使用FTP命令及反馈信息分析 [10:51:05.364] AT [10:51:05.364] OK [10:51:05.364] AT+QFLDS=? [10:53:01.120] OK [10:53:01.120] AT+QFLDS=“UFS” [10:53:24.871] +QFLDS: 499712,917503 [10:53:24.871] ...
  • 昨天拷贝服务器上的数据本地测试,结果发现可以连接远程,无法打开本地实例子。第一步:查看配置管理工具:SQL SERVER 服务报错:远程调用失败。百度搜索:VS2012安装后会安装SQL SERVER 2012 EXPRESS LOACLDB,和...
  • 对于开发者来说,windows是我们接触最多的操作系统了,但是Linux是我们必可少的一项重要技能,很多服务或者应用都需要在Linux下运行,掌握Linux系统的基本使用也是非常重要的,今天有一个需求就是需要监控某一个...
  • 2021年前端面试题及答案

    万次阅读 多人点赞 2020-02-11 19:29:34
    (HTTP 1.1新) 5xx:服务器端错误--服务器未能实现合法的请求 500 Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。 501 Not Implemented 服务器不支持实现请求所需要的功能。例如,客户...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    -d: 把记录写/var/log/wtmp文件里(-n这个参数包含了-d)。 -i: 在重开机之前先把所有与网络相关的装置停止。 install 1.作用 install命令的作用是安装或升级软件或备份数据,它的使用权限是所有用户。 ...
  • Wireshark学习

    千次阅读 多人点赞 2020-01-31 14:00:32
    2)只能监控链接交换模块的设备流量(因为路由器先把流量处理后交给了交换模块,交换模块再转交交换机,Wireshark接入的位置相当于交换模块和交换机之间自然只能接到交换模块的流量) 情形3:监控未安装交换模块...
  • python远程访问服务器获取文件

    千次阅读 2019-06-27 16:12:53
    1、使用paramiko模块进行sftp传输,实现在线读取文件,注意paramiko模块存在一些依赖,可能安装的时候会有一些小的障碍。 client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko....
  • git 上传本地代码到远程服务器分支

    千次阅读 2018-12-18 02:10:25
    3、最后就是将本地的库提交到远程作为分支了: git push origin master(本地的分支名):branch1(这里表示的是远程库的名字,可以是远程的master,也可以是某一个分支branch1,如果这个分支存在,那么上传的本地...
  • Python3 SSH远程连接服务器

    万次阅读 2018-11-08 17:24:26
    使用下面命令切换python3: activate py3 接着使用下面命令下载相关模块: pip install ecdsa pip install Crypto pip install paramiko 连接服务器操作: # -*- coding: utf-8 -*- import paramiko #...
  • 服务器远程管理与监控

    千次阅读 2019-03-28 21:33:16
    项目十一服务器远程管理与监控 项目学习目标 1.理解远程桌面安装机制; 2.掌握远程桌面配置机制; 3.掌握远程桌面连接终端服务器; 4.掌握远程控制服务器和主机的技术; 5.掌握服务器远程监控的方法。 学习难点 1.远程...
  • python 程序员进阶之路:从新手高手的100个模块

    万次阅读 多人点赞 2019-10-22 09:45:31
    在知乎和CSDN的圈子里,经常看到、听到一些 python 初学者说,学完基础语法后,知道该学什么,学了也知道怎么用,一脸的茫然。近日,CSDN的公众号推送了一篇博客,题目叫做《迷思:Python 学什么程度可以面试...
  • 前些天,VSCode推出了一系列新的插件,来实现远程开发的功能,对于许多使用Windows进行开发,但是需要将程序部署在服务器的用户来说,提供了非常大的便利。 这些插件分别是: Remote - SSH Remote - Containers ...
  • 微信小程序测试方案

    千次阅读 2019-05-19 15:13:42
    小程序主要分为两个主要的部分:view模块和service模块。view模块负责UI展示,它由wxml和wxss转换后的代码以及微信提供的辅助模块组成。一个view模块对应一个webview组件,小程序支持多个view存在,view模块通过微信...
  • 【微信小程序控制硬件第1篇 】 全网首发,借助 emq 消息...【微信小程序控制硬件第3篇 】 从软件硬件搭建一个微信小程序控制esp8266的项目,自定义通讯协议,为面试职位和比赛项目加分! 【微信小程序控制硬件...
  • Nodejs 使用express模块创建一个服务器

    千次阅读 2020-07-04 20:56:29
    使用express模块创建一个服务器 新建一个文件夹,文件夹名字非中文,名字也不要和模块名字一样 npm init -y 初始化 下载模块,去npm官网搜索模块,用他的说明来下 如果下载失败,则用 npm cache clean -f 这个命令...
  • 分布式系统概念

    万次阅读 多人点赞 2018-11-15 16:25:36
    反向代理是指请求真实是server1的,但是系统中为了统一或者做比如单点登录,会在server2服务器上安装一个nginx,里面配置server1的反向代理,那么之后请求url就可以写server2的地址,发出后server2, server2会...
  • Python中的paramiko是一个非常有用的模块,通过此模块,可以远程操控多台服务器,无需在服务器上安装任何东西,只需要在代码执行机器上有Python,paramiko环境就可以了,对于需要多台服务器协同工作或者要管理多台...
  • 一、前提本地OS为WINDOWS,远程服务器OS为Centos 7.二、准备工作1.在本地与远程服务器上都安装python3;2.本地项目开发采用pycharm+Django搭配;3.远程服务器上安装uWsgi,nginx....
  • 利用maven发布web项目到远程服务器

    千次阅读 2017-08-13 22:39:59
    项目发布的一般步骤是本地打好war包,然后通过ssh连接远程服务器,通过xftp等方法,将项目上传到远程tomcat中,操作和过程较为繁琐。   通过maven可以一次完成全部工作,只需一行命令即可。   本文远程...
  • 用Maven部署war包到远程Tomcat服务器

    千次阅读 2017-02-16 20:59:49
    目的:运行maven打包war包到远程Tomcat服务器 项目pom.xml文件中配置插件 MavenWarTest localTestServer http://localhost:8080/manager/text deploy2production
  • 下面我们对不是公网的情况,进行租借服务器,进行配置等操作进行学习。 简单了解一下公网IP:所谓的公网相当于一个详细的地址,不会更变。公网的计算机和Internet上的其他计算机可随意互相访问。 如果你的是内网,...
  • 1.本地修改代码,自动同步到远程服务器。 2.本地点击运行按钮,实际跑在服务器上。 步骤: 1.本地和远程安装好ssh,设置好服务器用户组。 2.在服务器创建同步路径。 3. 在服务器创建好python的虚拟环境venv,并...
  • 目的是通过NB-IoT协议将数据发送到服务器端。  现在已有不少NB-IoT模块,本人采用的是移远的BC95模块。  接线:外接电源供电 串口接右下角三个接口,GND,TXD,RXD分别和USB转TTL线的GND、RXD、TXD连接。3.3V...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 170,288
精华内容 68,115
关键字:

服务器找不到远程模块