前言(源码使用介绍在最后)

  

  一,微信小程序篇小程序下载(该源码为这节测试源代码)

  

  二.有多少人一直在期盼着小程序可以实现SmartConfig或者Airkiss的功能? 来吧!我的这种方式包您满意.

    注:APUConfig 是我自己取的名字(哈哈谁让这种方式,我是第一个在微信小程序上实现的),代表着 AP  UDP  Config

    绑定流程详细说明:

    APUConfig小程序端源码

  https://gitee.com/yang456/APUConfig.git

    

实现功能概要

  1.小程序使用APUConfig给Wi-Fi模块配网,并获取设备MAC等信息,然后通过MQTT控制绑定的Wi-Fi设备.

  2.演示视频:  https://www.bilibili.com/video/av74786875/

测试准备工作

一,下载单片机程序(请自行下载)

  

二,打开微信小程序软件,导入本节工程

  

  

三,把小程序安装到手机运行

  

四,调整波动开关位置,STM32和Wi-Fi 串口 通信

  

五,短接STM32的PB2和Wi-Fi模块的RST引脚(内部程序使用该引脚硬件复位Wi-Fi)

  

开始测试

一,点击小程序下方的添加设备按钮

  

二,选择添加Wi-Fi设备

  

三,输入路由器密码(注:Wi-Fi名称自动获取,也可自己填写)

四.长按PB5大约4S,等待指示灯快闪,松开PB5,Wi-Fi模块进入配网状态

  

五.点击小程序上的 "绑定设备"按钮,开始搜索设备,绑定成功,将自动跳转到主页面,显示绑定的Wi-Fi设备

  5.1 正在尝试连接Wi-Fi模块的热点

  

  5.2 连接上热点,正在和模块通信

  

  5.3 成功绑定设备

  

六.点击设备,进入控制页面,控制设备

  6.1 点击设备

  

  6.2 控制继电器吸合

      

  6.2 控制继电器断开

      

结语

希望能够为在用小程序做物联网开发的大家解决当前最大的烦心事!

知识是死的,人是活的!

希望大家不仅要有超强的学习能力,还需要有灵活运用知识的能力.

现在想想我挺感谢我的高中班主任 (朱兆同老师),是他让我开始了自学生涯,培养了这种能力.

师者,传道受业解惑者也.   传道:应该是首当其冲的吧!

绑定部分小程序端源码

https://gitee.com/yang456/APUConfig.git   (下载最新版本请在git下载)

小程序端APUConfig源码:

APUConfig.js

  1. // pages/APUConfig/APUConfig.js
  2. var util = require("../../utils/util.js");
  3.  
  4. var APUConfigStart = false;//是否在配网
  5.  
  6. var APUConfigconnectAPCount = ;//连接热点的次数
  7.  
  8. var APUConfigSendUDPDataIntervalNumber = ;//发送UDP数据的定时器编号
  9.  
  10. var APUConfigSendUDPDataCount = ;//发送UDP数据的次数
  11.  
  12. var udp;
  13.  
  14. Page({
  15.  
  16. /**
  17. * 页面的初始数据
  18. */
  19. data: {
  20. ssid: '',
  21. password: ''
  22. },
  23. // 获取路由器名称
  24. ssidInput: function (e) {
  25. this.data.ssid = e.detail.value;
  26. },
  27. // 获取输入密码
  28. passwordInput: function (e) {
  29. this.data.password = e.detail.value;
  30. },
  31. /**
  32. * 成功连接热点
  33. */
  34. connectWifiSuccess: function(res)
  35. {
  36. var _this = this;
  37. udp = wx.createUDPSocket()//启用UDP
  38. udp.bind()
  39.  
  40. wx.hideLoading();
  41. wx.showLoading({
  42. title: '正在绑定'
  43. })
  44.  
  45. udp.onListening(function (res) {
  46. console.log('监听中...')
  47. console.log(res)
  48. })
  49.  
  50. //定时1S发送一次UDP数据
  51. try { clearInterval(APUConfigSendUDPDataIntervalNumber); } catch (e) { }
  52.  
  53. APUConfigSendUDPDataIntervalNumber = setInterval(
  54. function () {
  55. udp.send
  56. ({
  57. address: '192.168.4.1',
  58. port: ,
  59. message: "{\"ssid\":" + "\"" + _this.data.ssid + "\"" + "\"pwd\":" + "\"" + _this.data.password + "\"" + "}"
  60. })
  61. APUConfigSendUDPDataCount = APUConfigSendUDPDataCount + ;
  62. console.log('发送数据: ' + "{\"ssid\":" + "\"" + _this.data.ssid + "\"" + "\"pwd\":" + "\"" + _this.data.password + "\"" + "}");
  63.  
  64. if (APUConfigSendUDPDataCount>)//发送了20次,还没绑定上
  65. {
  66. try { clearInterval(APUConfigSendUDPDataIntervalNumber); } catch (e) { }
  67. APUConfigSendUDPDataCount = ;
  68. APUConfigconnectAPCount = ;
  69. APUConfigStart = false;//
  70. udp.close();
  71. wx.hideLoading();
  72. wx.showModal({//弹出对话框
  73. title: '绑定失败',
  74. content: '请重新尝试'
  75. })
  76. }
  77. },
  78. ,
  79. "null");//启动定时器
  80.  
  81. //UDP接收到消息
  82. udp.onMessage(function (res) {
  83. console.log(res)
  84. let str = util.newAb2Str(res.message);//接收消息
  85. console.log('str===' + str)
  86.  
  87. //{ "mac": "dc:4f:22:10:b0:ce", "ip": "192.168.0.101" }
  88.  
  89. try { clearInterval(APUConfigSendUDPDataIntervalNumber); } catch (e) { }
  90. try { udp.close(); } catch (e) { }//关闭UDP
  91. APUConfigSendUDPDataCount = ;
  92. APUConfigconnectAPCount = ;
  93. APUConfigStart = false;//复位所有变量
  94. wx.hideLoading();//关闭提示框
  95.  
  96. if (str!=null)
  97. {
  98. let json = JSON.parse(str);//解析JSON数据
  99. if (json != null)
  100. {
  101. let mac = json.mac;
  102. let ip = json.ip;
  103. if (mac != null)
  104. {
  105. wx.reLaunch({
  106. url: '../index/index?ClientID=' + mac + "&" + "IP=" + ip
  107. })
  108. }
  109. }
  110. }
  111. })
  112.  
  113. },
  114. /**
  115. * 连接无线失败
  116. */
  117. connectWifiFail: function (res)
  118. {
  119. var _this = this;
  120.  
  121. if (APUConfigconnectAPCount<)//尝试连接热点的次数
  122. {
  123. APUConfigconnectAPCount = APUConfigconnectAPCount + ;
  124. console.log('连接Wi-Fi: wifi_8266_bind');
  125. wx.connectWifi//控制连接Wi-Fi无线信号
  126. ({
  127. SSID: "wifi_8266_bind",
  128. password: "",
  129. success: _this.connectWifiSuccess,
  130. fail: _this.connectWifiFail
  131. })
  132. }
  133. else
  134. {
  135. APUConfigconnectAPCount = ;
  136. APUConfigStart = false;//
  137. wx.hideLoading();
  138. wx.showModal({//弹出对话框
  139. title: '绑定失败',
  140. content: '请重新尝试'
  141. })
  142. }
  143.  
  144. },
  145. //点击绑定按钮
  146. BindClick: function () {
  147.  
  148. var _this = this;
  149.  
  150. if (_this.data.ssid.length == || _this.data.password.length == ) {
  151. wx.showModal({//弹出对话框
  152. title: '提示',
  153. content: 'Wi-Fi名称和密码不能为空'
  154. })
  155. }
  156. else
  157. {
  158. APUConfigStart = true;//开始配网
  159.  
  160. //控制连接Wi-Fi无线信号
  161. wx.connectWifi
  162. ({
  163. SSID: "wifi_8266_bind",
  164. password: "",
  165. success: _this.connectWifiSuccess,
  166. fail: _this.connectWifiFail
  167. })
  168.  
  169. }
  170. },
  171. /**
  172. * 生命周期函数--监听页面加载
  173. */
  174. onLoad: function (options) {
  175. var _this = this;
  176.  
  177. _this.GetWiFiSSID();//显示当前连接的Wi-Fi名称
  178.  
  179. //启动网络状态监听
  180. wx.onNetworkStatusChange(function (res)
  181. {
  182. console.log("绑定设备:网络改变" + res.isConnected + " " + res.networkType);
  183. if (res.networkType == "wifi")//当前连接的网络类型是WIFI
  184. {
  185. console.log("绑定设备:当前连接的网络类型是WIFI");
  186. if (!APUConfigStart)//没在配网状态
  187. {
  188. _this.GetWiFiSSID();
  189. }
  190. }
  191. else//其它网络
  192. {
  193. if (!APUConfigStart)//没在配网状态
  194. {
  195. _this.setData({//清空显示的wifi名称
  196. ssidValue: ""
  197. })
  198. }
  199. }
  200. })
  201. },
  202. /**
  203. * 获取链接的WIFI名称
  204. */
  205. GetWiFiSSID: function () {
  206. var _this = this;
  207. wx.startWifi({//启用WIFI功能
  208. success(res) {
  209. wx.getConnectedWifi//获取链接的Wi-Fi信息
  210. ({
  211. success(res) //获取到信息
  212. {
  213. _this.data.ssid = res.wifi.SSID;
  214.  
  215. console.log("绑定设备:连接的Wi-Fi名称 " + _this.data.ssid);
  216.  
  217. _this.setData({
  218. ssidValue: _this.data.ssid
  219. })
  220. },
  221. fail(res) {
  222. }
  223. })
  224. }
  225. })
  226. },
  227. /**
  228. * 生命周期函数--监听页面显示
  229. */
  230. onShow: function () {
  231. this.GetWiFiSSID();//显示当前连接的Wi-Fi名称
  232. },
  233. /**
  234. * 生命周期函数--监听页面卸载
  235. */
  236. onUnload: function () {
  237. try { clearInterval(APUConfigSendUDPDataIntervalNumber); } catch (e) { }
  238. try { udp.close(); } catch (e) { }
  239. APUConfigSendUDPDataCount = ;
  240. APUConfigconnectAPCount = ;
  241. APUConfigStart = false;//
  242. wx.hideLoading();
  243. },
  244. /**
  245. * 生命周期函数--监听页面隐藏
  246. */
  247. onHide: function () {
  248.  
  249. },
  250. /**
  251. * 页面相关事件处理函数--监听用户下拉动作
  252. */
  253. onPullDownRefresh: function () {
  254.  
  255. },
  256.  
  257. /**
  258. * 页面上拉触底事件的处理函数
  259. */
  260. onReachBottom: function () {
  261.  
  262. },
  263.  
  264. /**
  265. * 用户点击右上角分享
  266. */
  267. onShareAppMessage: function () {
  268.  
  269. }
  270. })

APUConfig.json

  1. {
  2. "usingComponents": {}
  3. }

APUConfig.wxml

  1. <!--pages/APUConfig/APUConfig.wxml-->
  2.  
  3. <view class="container">
  4. <!--提示-->
  5.  
  6. <view class="hint">
  7. <text style="color: #545454; font-size:35rpx;">绑定设备前请确定完成以下步骤</text>
  8.  
  9. <view>
  10. <text style="color:#09bb07; font-size:35rpx;"></text>
  11. <text style="font-size:35rpx;" space='nbsp'> 请先连接自家路由器热点</text>
  12. </view>
  13.  
  14. <view>
  15. <text style="color:#09bb07; font-size:35rpx;"></text>
  16. <text style="font-size:35rpx;" space='nbsp'> 给设备上电</text>
  17. </view>
  18.  
  19. <view>
  20. <text style="color:#09bb07; font-size:35rpx;"></text>
  21. <text style="font-size:35rpx;" space='nbsp'> 长按"配置按键"大约3S,直至指示灯快闪</text>
  22. </view>
  23.  
  24. <view>
  25. <text style="color:#09bb07; font-size:35rpx;"></text>
  26. <text style="font-size:35rpx;" space='nbsp'> 输入路由器密码,点击“添加设备”按钮</text>
  27. </view>
  28.  
  29. <view>
  30. <text style="color:#09bb07; font-size:35rpx;" ></text>
  31. <text style="font-size:35rpx;" space='nbsp'> 绑定成功后,软件自动跳转到设备页面</text>
  32. </view>
  33.  
  34. </view>
  35.  
  36. <view class="login-from">
  37. <!--WiFi名称-->
  38. <view class="inputView">
  39. <label class="loginLab">WiFi名称:</label>
  40. <input class="inputText" placeholder="请输入路由器热点" bindinput="ssidInput" value="{{ssidValue}}"/>
  41. </view>
  42. <view class="line"></view>
  43.  
  44. <!--WiFi密码-->
  45. <view class="inputView">
  46. <label class="loginLab">WiFi密码:</label>
  47. <input class="inputText" placeholder="请输入密码" bindinput="passwordInput"/>
  48. </view>
  49.  
  50. <!--按钮-->
  51. <view class="BindClickView">
  52. <button class="BindClick" type="primary" bindtap="BindClick">绑定设备</button>
  53. </view>
  54. </view>
  55. </view>

APUConfig.WXSS

  1. /* pages/APUConfig/APUConfig.wxss */
  2. page{
  3. height: %;
  4. }
  5.  
  6. .container {
  7. height: %;
  8. display: flex;
  9. flex-direction: column;
  10. padding: ;
  11. box-sizing: border-box;
  12. background-color: #f2f2f2
  13. }
  14.  
  15. /*提示信息*/
  16. .hint {
  17. display: flex;
  18. flex-direction: column;
  19. margin-top: 10rpx
  20. }
  21.  
  22. /*表单内容*/
  23. .login-from {
  24. margin-top: 50px;
  25. width: %;
  26. flex: auto;
  27. height:%;
  28. }
  29.  
  30. .inputView {
  31. display: flex;
  32. flex-direction: row;
  33. background-color: #fff;
  34. }
  35.  
  36. /*Wi-Fi名称和密码两个字*/
  37. .loginLab {
  38. margin-left: 10px;
  39. margin-top: 15px;
  40. margin-bottom: 15px;
  41. color: #;
  42. font-size: 16px
  43. }
  44.  
  45. .inputText {
  46. margin-left: 10px;
  47. text-align: left;
  48. margin-top: 15px;
  49. color: black;
  50. font-size: 16px
  51. }
  52.  
  53. .line {
  54. width: %;
  55. height: 1px;
  56. background-color: #cccccc;
  57. margin-top: 1px;
  58. }
  59. /*按钮*/
  60. .BindClickView {
  61. width: %;
  62. height: auto;
  63. background-color: #f2f2f2;
  64. margin-top: 0px;
  65. margin-bottom: 0px;
  66. padding-bottom: 0px;
  67. }
  68.  
  69. .BindClick {
  70. width: %;
  71. margin-top: 35px;
  72. }
util.js
  1. const formatTime = date => {
  2. const year = date.getFullYear()
  3. const month = date.getMonth() +
  4. const day = date.getDate()
  5. const hour = date.getHours()
  6. const minute = date.getMinutes()
  7. const second = date.getSeconds()
  8.  
  9. return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
  10. }
  11.  
  12. const formatNumber = n => {
  13. n = n.toString()
  14. return n[] ? n : '' + n
  15. }
  16.  
  17. // util.newAb2Str代码
  18. var newAb2Str = function newAb2Str(arrayBuffer) {
  19. let unit8Arr = new Uint8Array(arrayBuffer);
  20. let encodedString = String.fromCharCode.apply(null, unit8Arr),
  21. decodedString = decodeURIComponent(escape((encodedString)));//没有这一步中文会乱码
  22. return decodedString;
  23. }
  24.  
  25. module.exports = {
  26. formatTime: formatTime,
  27. newAb2Str: newAb2Str
  28. }

单片机端APUConfig,Wi-Fi配置流程

  1. /**
  2. ******************************************************************************
  3. * @author yang feng wu
  4. * @version V1.0.0
  5. * @date 2019/10/12
  6. * @brief 配置8266
  7. ******************************************************************************
  8. 一,使用说明:指示灯(PC13)
  9. 1,把以下程序放在1ms定时器中断中
  10. SmartConfigCnt++;
  11. if(SmartConfigFlage)//配网状态,指示灯闪耀
  12. {
  13. Config8266LedDelay++;
  14. if(Config8266LedDelay>100)
  15. {
  16. Config8266LedDelay=0;
  17. SmartConfigPinOut = ~SmartConfigPinOut;
  18. }
  19. }
  20. else
  21. {
  22. Config8266LedDelay=0;
  23. }
  24.  
  25. 2,调用使用,建议使用一个按钮控制
  26.  
  27. if(SmartConfig())//配网成功
  28. {
  29. //执行操作
  30. }
  31. ******************************************************************************
  32. APUConfig配网绑定流程
  33. 设备端
  34. 1.获取设备MAC XX:XX:XX:XX:XX:XX
  35. 2.控制WIFI发出固定无线网 名称:wifi_8266_bind 密码:11223344
  36. 3.UDP 监听固定端口5556
  37. 4.等待接收客户端的消息. 消息格式{"ssid":"qqqqq","pwd":"11223344"}
  38. 5.提取路由器名称和密码,连接路由器
  39. 6.获取链接路由器后分的的IP. 假设是192.168.10.2 以防后期实现局域网通信备用
  40. 7.UDP发送数据,{"mac":"XX:XX:XX:XX:XX:XX","ip":"192.168.10.2"}
  41.  
  42. APP/小程序/上位机
  43. 1.提示用户连接自己的路由器,长按设备按钮使得设备进入UDP监听状态,提示用户输入路由器密码
  44. 2.用户点击绑定设备 , 控制手机尝试连接 名称为 wifi_8266_bind 的无线 (内部控制)
  45. 3.成功连接无线,往192.168.4.1:5556 UDP发送路由器信息,1S 1次
  46. 4.接收到 {"mac":"XX:XX:XX:XX:XX:XX","ip":"192.168.10.2"}
  47. 5.绑定成功
  48. 8.完
  49. */
  50.  
  51. #define CONFIG8266_C_
  52. #include "include.h"
  53.  
  54. char SmartConfigFlage = ;//是不是在配网
  55. u32 SmartConfigCnt = ;//配网连接路由器延时使用
  56. char SmartConfigSuccess = ;//是否配网成功
  57. u32 Config8266Delay=;//执行Config8266函数内部所需延时
  58. u32 Config8266LedDelay=;//配置8266指示灯闪耀
  59.  
  60. char ThisSSID[]="";//记录路由器名称
  61. char ThisPWD[]="";//记录密码
  62. char ThisMAC[]="";//记录设备MAC
  63. char ThisIP[]="";//记录设备连接路由器分得的IP
  64.  
  65. /**
  66. * @brief 启用APUConfig 给WIFI配网
  67. * @ warn None
  68. * @param None
  69. * @param None
  70. * @param None
  71. * @param None
  72. * @retval 1:成功
  73. * @example
  74. **/
  75. char APUConfig(void)
  76. {
  77. u32 delay=,Flage=;
  78. SmartConfigPinOut = ;
  79. SmartConfigSuccess = ;
  80. Rst8266();
  81.  
  82. if(ConfigModuleBlock("+++","+++",NULL))//退出透传
  83. {
  84. if(ConfigModuleBlock("AT+RESTORE\r\n","ready",NULL))//恢复出厂设置
  85. {
  86. if(ConfigModuleBlock("AT+CWMODE_DEF=3\r\n","OK",NULL))//模式3
  87. {
  88. if(ConfigModuleBlock("AT+CIPSTAMAC_CUR?\r\n","MAC_CUR",NULL))//MAC
  89. {
  90. MainString = StrBetwString(Usart1ReadBuff,"MAC_CUR:\"","\"");//得到MAC
  91.  
  92. if(strlen(MainString) ==)
  93. {
  94. memset(ThisMAC,,sizeof(ThisMAC));
  95. memcpy(ThisMAC,MainString,);
  96. }
  97. else {goto end;}
  98. cStringRestore();
  99.  
  100. if(ConfigModuleBlock("AT+CWSAP_DEF=\"wifi_8266_bind\",\"11223344\",11,4,4\r\n","OK",NULL))//配置发出的无线
  101. {
  102. if(ConfigModuleBlock("AT+CIPSTART=\"UDP\",\"192.168.4.2\",5555,5556,2\r\n","OK",NULL))//配置UDP
  103. {
  104. SmartConfigCnt = ;
  105. while()
  106. {
  107. //{"ssid":"qqqqq","pwd":"11223344"}
  108. //{"mac":"XX:XX:XX:XX:XX:XX","ip":"192.168.10.2"}
  109. //*StrBetwString(char *Str,char *StrBegin,char *StrEnd)
  110. IWDG_Feed();//喂狗
  111. if(Usart1ReadFlage==)
  112. {
  113. Usart1ReadFlage=;
  114.  
  115. MainString = StrBetwString(Usart1ReadBuff,"\"ssid\":\"","\"");//获取ssid
  116. if(MainString!=NULL)
  117. {
  118. memset(ThisSSID,,sizeof(ThisSSID));
  119. sprintf(ThisSSID,"%s",MainString);
  120. cStringRestore();
  121.  
  122. MainString = StrBetwString(Usart1ReadBuff,"\"pwd\":\"","\"");//获取pwd
  123. if(MainString!=NULL)
  124. {
  125. memset(ThisPWD,,sizeof(ThisPWD));
  126. sprintf(ThisPWD,"%s",MainString);
  127. cStringRestore();
  128. break;
  129. }
  130. else {goto end;}
  131. }
  132. else {goto end;}
  133. }
  134.  
  135. if(SmartConfigCnt>) {goto end;}//60S超时
  136. }
  137.  
  138. if(ConfigModuleBlock("AT+CWAUTOCONN=1\r\n","OK",NULL))//自动连接路由器
  139. {
  140. memset(MainBuffer,,sizeof(MainBuffer));
  141. sprintf(MainBuffer,"AT+CWJAP_DEF=\"%s\",\"%s\"\r\n",ThisSSID,ThisPWD);
  142. if(ConfigModuleBlock(MainBuffer,"WIFI GOT IP",NULL))//设置连接的路由器
  143. {
  144. Flage = ;//配网成功
  145. SmartConfigSuccess=;
  146.  
  147. if(ConfigModuleBlock("AT+CIPSTA_CUR?\r\n","CIPSTA_CUR:ip",NULL))//获取路由器分得的IP
  148. {
  149. MainString = StrBetwString(Usart1ReadBuff,"CUR:ip:\"","\"");//得到路由器分得的IP
  150. if(MainString != NULL)
  151. {
  152. memset(ThisIP,,sizeof(ThisIP));
  153. memcpy(ThisIP,MainString,strlen(MainString));
  154.  
  155. split(MainString,".",NULL,&MainLen);//XXX.XXX.XXX.XXX
  156.  
  157. if(MainLen == )
  158. {
  159. MainLen = sprintf(MainBuffer,"{\"mac\":\"%s\",\"ip\":\"%s\"}",ThisMAC,ThisIP);
  160. MainLen = sprintf(MainBuffer,"AT+CIPSEND=%d\r\n",MainLen);
  161.  
  162. if(ConfigModuleBlock(MainBuffer,">",NULL))//准备向UDP客户端发送消息
  163. {
  164. memset(MainBuffer,,sizeof(MainBuffer));
  165. MainLen = sprintf(MainBuffer,"{\"mac\":\"%s\",\"ip\":\"%s\"}",ThisMAC,ThisIP);
  166. printf("%s",MainBuffer);
  167.  
  168. SmartConfigCnt = ;
  169. while(SmartConfigCnt<)
  170. {
  171. IWDG_Feed();//喂狗
  172. }
  173.  
  174. }else {goto end;}
  175. }else {goto end;}
  176. }else {goto end;}
  177. cStringRestore();
  178. }
  179. }
  180. }
  181. }
  182. }
  183. }
  184. }
  185. }
  186. }
  187. end:
  188. if(ConfigModuleBlock("AT+CWMODE_DEF=1\r\n","OK",NULL))//模式1
  189. {}
  190. Rst8266();//复位
  191. SmartConfigFlage = ;
  192. return Flage;
  193. }

1.把文件导入工程

    

2.请在util.js添加如下代码

  

使用
1.跳转到 APUConfig 函数,请在自己需要的地方自行填写

  

2.绑定完成,跳转到的页面(请根据自己的设置跳转路径)

  

3.在跳转的页面获取绑定的数据

  

ESA2GJK1DH1K微信小程序篇: 测试微信小程序APUConfig给WI-Fi模块配网并绑定设备,并通过MQTT控制设备的更多相关文章

  1. ESA2GJK1DH1K微信小程序篇: 测试微信小程序扫描Air202上面的二维码绑定设备,并通过MQTT控制设备

    前言 一,微信小程序篇小程序下载(该功能为小程序篇基础功能源码) 实现功能概要 微信小程序通过扫描GPRS上的二维码,绑定GPRS设备.然后使用小程序通过GPRS远程控制开发板上的继电器, 远程显示单 ...

  2. 5-(微信小程序篇)关于WiFi模块配网以后利用小程序绑定设备,绑定方式说明

    https://www.cnblogs.com/yangfengwu/p/11625189.html 众所周知:使用微信Airkiss 只能给设备配网,并不能够获取设备的MAC地址信息,但是我在 ht ...

  3. ESA2GJK1DH1K基础篇: 测试APP扫描Air202上面的二维码绑定通过MQTT控制设备(兼容SIM800)

    前言 此程序兼容SIM800 如果想绑定SIM800,请把其IMEI号,生成二维码,用手机APP扫描. 实现功能概要 APP通过扫描二维码获取GPRS设备的IMEI号,然后设置订阅的主题:device ...

  4. 微信小程序篇(微信小程序的支付)

    微信小程序的支付和微信公众号的支付是类似的,对比起来还比公众号支付简单了一些,我们只需要调用微信的统一下单接口获取prepay_id之后我们在调用微信的支付即可. 今天我们来封装一般node的支付接口 ...

  5. 10-网页,网站,微信公众号基础入门(使用微信自带配置选项实现Airkiss配网)

    https://www.cnblogs.com/yangfengwu/p/11066036.html 如果提交失败多提交两次,只要上一节可以,,这一节一定可以的 如果没有设备 这个是我的二维码 咱就测 ...

  6. ESP8266开发之旅 网络篇⑭ web配网

    1. 前言     目前,市面上流行多种配网方式: WIFI模块的智能配网(SmartConfig以及微信AirKiss配网) SmartConfig 配网方式 请参考博主之前的博文 ESP8266开 ...

  7. ESA2GJK1DH1K微信小程序篇: 安装Nginx,配置反向代理

    前言 一,为什么需要反向代理 小程序访问的是 443端口,咱需要把443端口的数据传给MQTT 这节为了避免大家配置出错,以下源码已经配置. 如果大家想自己配置,请参考 https://www.cnb ...

  8. 【转】微信小程序专项测试

    微信小程序专项测试 by 云层 原文地址: http://mp.weixin.qq.com/s?__biz=MzA4NDIzNTIzNA==&mid=2654370226&idx=1& ...

  9. WeTest+微信:小程序云端测试系统上线

    日前,微信新增小程序测试系统,可便于开发者检测小程序缺陷,评估小程序产品质量.在小程序发布之前,开发者可将小程序代码提交到测试系统,在不同型号的手机真机上运行,执行完毕后自动生成测试报告.小程序云端测 ...

随机推荐

  1. opencv imshow plt imshow

    opencv官方文档上写的,https://docs.opencv.org/master/dc/d2e/tutorial_py_image_display.html Color image loade ...

  2. laravel hash密码生成和密码验证

    在laravel中 登录表单中的密码是用hash来生成的. 在生成密码需要用到 laravel框架中的方法(都是laravel封装好了的) bcrypt($password)方法,直接将获取到的pas ...

  3. VS代码调试出现:当前不会命中断点。还没有为该文档加载任何符号。

    第一步:一定要检查最顶部自己设置的是 Release模式还是Debug模式!!!下面这个图就是在我搜了好多解决方式之后,突然发现自己开的是Release模式!!!吐血. 第二步:如果你已经确定了自己是 ...

  4. mysql 5.7 修改root密码允许远程连接

    1.修改root密码(其他用户类似)  试过网上看的一些 在mysql数据库执行 update user set password='新密码'  where user='root' 执行说找不到字段, ...

  5. H5+asp.net 微信开发 遇到过的坑

    一.微信授权登录 1. 根据code 获取_access_tokens 2. 根据取到的openid和_access_tokens获取用户信息最神奇的是我用我自己的微信账号测试,一开始还可以取到tok ...

  6. 树莓派4B安装Raspbian系统及配置

    2019/11/11, 树莓派4B, Raspbian Buster 摘要:给树莓派4B安装系统及基础配置 树莓派实验室参考文档 准备工具 树莓派4B硬件 SD卡格式化工具 SD Formatter ...

  7. POST请求转换为PUT或者Delete请求、处理post请求乱码的过滤器、Get请求乱码

    在web.xml中配置 <!--配置HiddenHttpMethodFilter : 将所有的POST请求转换为PUT或者Delete请求 --><filter> <fi ...

  8. 解决javaScript在不同时区new Date()显示值不同问题

    在日期格式化时遇到的问题,日期格式化方法在最下面 如果在中国时区    formatDate('2019-07-09')  结果是 ‘2019-07-09’ 如果 在夏威夷时区 utc-10:00 或 ...

  9. 虚拟机安装mysql踩坑记录

    本章节主要讲解的是在虚拟机centOs7版本以上安装mysql5.6版本,亲测可以直接使用,有需要帮助的小伙伴可以加本人QQ2246451792@qq.com!!!! 卸载centOs7自带的mari ...

  10. 浏览器渲染html的过程

    关于浏览器如何渲染html界面一直不太清晰,所以现在理一理.由于本身对前深入的东西不太清晰,这篇博客更多的是在记录. 参考:https://www.cnblogs.com/dojo-lzz/p/398 ...