WiFi

一、系统方案

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


二、硬件设计

ESP8266模块作为一个透传模块使用,RXD、TXD分别连接51单片机的TXD和RXD,VCC和EN管脚接3.3V电压,GND接地,只需要连接这些管脚,ESP8266模块就可以正常工作了。

单片机的P2^0,P2^1,P2^2,P2^3输出高低电瓶控制四路继电器,继电器模块是从网上购买的已经焊接好的模块,其他地方为手工万用板焊接。


三、单片机软件设计

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

1.串口和ESP8266初始化:

/**
*发送单个字符
*/
void sendChar(uchar a)
{
	SBUF = a;
	while(TI==0);
	TI=0;
}
 
/**
*发送字符串
*/
void sendString(uchar *s)
{
	while(*s!='\0')
	{
		sendChar(*s);
		s++;
	}	
}
 
/**
*初始化ESP8266模块
*/
void initEsp()
{
	TMOD=0x20;		//定时器1工作在方式2
	TH1 = 0xfd;		//波特率9600
	TL1 = 0xfd;
	SM0=0;				//串口工作在方式1
	SM1=1;
	EA = 1;				//开总中断
	REN = 1;			//使能串口
	TR1 = 1;			//定时器1开始计时
	delayms(200);
	sendString("AT+CWMODE=2\r\n");		//AP模式
	delayms(200);	
	sendString("AT+CIPMUX=1\r\n");		//允许多连接
	delayms(200);	
	sendString("AT+CIPSERVER=1\r\n");	//建立TCP Server
	delayms(200);	
	ES = 1;				//开串口中断
}

sendString("AT+CWMODE=2\r\n") ----- 单片机发送AT指令到ESP8266模块,AT+CWMODE=2是将ESP8266设置为AP模式,\r\n是换行,因为AT指令加换行才能生效。
sendString("AT+CIPMUX=1\r\n") ---- 允许多连接
sendString("AT+CIPSERVER=1\r\n") ---- 建立TCP Server

2. 串口中断函数,负责处理App发送给单片机的指令:

/**
* 串口中断函数,负责处理App发送给单片机的指令
*/
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':			//打开继电器
					JDQ4=0;
					break;
				case '2':			//关闭继电器
					JDQ4=1;
					break;
				case '3':
					JDQ3=0;
					break;
				case '4':
					JDQ3=1;
					break;
				case '5':
					JDQ2=0;
					break;
				case '6':
					JDQ2=1;
					break;
				case '7':
					JDQ1=0;
					break;
				case '8':
					JDQ1=1;
					break;
				
			}
		}
  }
}

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

四、Android APP软件设计

Android APP是借助Android Studio来开发的,界面比较清新。esp8266默认的IP地址是192.168.4.1,端口号是333。四个开关控制四路继电器,其中长按开关的名字可以编辑开关名称,APP界面截图如下所示:


负责连接ESP8266的按钮点击回调方法:

/**
 * 连接按钮点击事件回调方法
 * @param v
 */
@Override
public void onClick(View v) {
    if(v.getId()==R.id.btn_connect){
        if (mSocket == null || !mSocket.isConnected()) {
            new Thread(){
                @Override
                public void run() {
                    try {
                        mSocket = new Socket("192.168.4.1", 333);
                        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();
                            }
                        });
                    }
                }
            }.start();
        }
        if (mSocket != null && mSocket.isConnected()) {
            try {
                mSocket.close();
                mBtnConnect.setText("连接");
                mSocket = null;
            } catch (IOException e) {
                e.printStackTrace();
                mSocket = null;
            }
        }
    }
}

滑动开关点击回调方法,发送指令到单片机控制继电器的开关:

/**
 * 滑动按钮监听事件,发送指令到单片机控制继电器开关
 * @param buttonView
 * @param isChecked
 */
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    switch (buttonView.getId()) {
        case R.id.switch1:
            if (isChecked) {
                //turn on
                Log.d(TAG, "onCheckedChanged: send1");
                sendData("1");
            } else {
                //turn off
                Log.d(TAG, "onCheckedChanged: send2");
                sendData("2");
            }
            break;
        case R.id.switch2:
            if (isChecked) {
                //turn on
                Log.d(TAG, "onCheckedChanged: send3");
                sendData("3");
            } else {
                //turn off
                Log.d(TAG, "onCheckedChanged: send4");
                sendData("4");
            }
            break;
        ....
		....
		....
           
    }
}

本文完!

版权声明:本文为CSDN博主 daxiniot 的原创文章,
遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:
https://blog.csdn.net/tongxin082/article/details/108685179

围观 199

首先我们来看一下嵌入式WiFi的来源以及与普通WiFi的区别。

我们都知道笔记本、手机、平板电脑等这类产品具有强大的CPU和大容量的存储器进行网络通信数据的处理和存储,因此在使用WiFi时不需要额外的MCU,完全借助其高速处理器和庞大的软件系统。但是对于家电、仪表、LED灯等智能家居产品,因为该类产品的主控芯片可能是成本很低、功能简单的MCU,因此这类产品无法支持普通Wi-Fi的功能。同时,还有一个重要的原因就是普通Wi-F的功耗比较高,而嵌入式WIFI在功耗上做了很大的改善,比较适合对功耗要求高的无线家电设备。

基于上述原因,各个无线厂商相继推出了嵌入式WiFi模块。嵌入式WiFi模块的特点是软硬件集成度高,整个嵌入式WiFi模块集成了射频收发器、MAC、WIFI驱动、所有WIFI协议、无线安全协议、一键连接等。总之,一句话:嵌入式WiFi应物联网而生!

下面我们针对嵌入式WiFi与普通WiFi来进行对比,通过下表的对比,我们大致上可以理解到什么是嵌入式WiFi。

嵌入式WiFi与普通WiFi有什么不同?

在分析WiFi驱动前,分享一下本人对Linux驱动的一些了解,其实纵观Linux众多的设备驱动,几乎都是以总线为载体,所有的数据传输都是基于总线形式的,即使设备没有所谓的总线接口,但是Linux还是会给它添加一条虚拟总线,如platform总线等;介于WIFI的驱动实在是太庞大了,同时又是基于比较复杂的USB总线,所以建议大家先了解一下USB设备驱动和网络设备驱动。

我们要看懂WiFi驱动,首先要明白WiFi的工作原理。从对于支持802.11n、802.11ac这些比较无线标准的WiFi芯片,其驱动程序也会越来越复杂。那么我们怎么入手去了解及分析它呢?

网上很多人分析Linux设备驱动都是从模块加载入手去分析它的驱动源码。以本人从事Linux设备驱动多年的经验,这确实是一条很直观又非常好的思路。但是这只局限于设备功能少、接口较简单、驱动源码较少的设备驱动。对于功能复杂、驱动源码庞大的设备驱动,根据这条思路,很多开发者可能会无耐心走下去,或者会走向死胡同。

现在我们可以这样来看,从硬件层面上看,WIFI设备与CPU通信是通过USB接口的,与其他WiFi设备之间的通信是通过无线射频(RF)。从软件层面上看,Linux操作系统要管理WiFi设备,那么就要将WiFi设备挂载到USB总线上,通过USB子系统实现管理。而同时为了对接网络,又将WiFi设备封装成一个网络设备。

我们以USB接口的WIFI模块进行分析:

(1)从USB总线的角度去看,它是USB设备;
(2)从Linux设备的分类上看,它又是网络设备;
(3)从WIFI本身的角度去看,它又有自己独特的功能及属性,因此它又是一个私有的设备。

通过上述的分析,我们只要抓住这三条线索深入去分析它的驱动源码,整个WIFI驱动框架就会浮现在你眼前。

1、现在我们先从USB设备开始,要写一个USB设备驱动,那么大致步骤如下:

(1)需要针对该设备定义一个USB驱动,对应到代码中即定义一个usb_driver结构体变量。代码如下:
struct usb_driver xxx_usb_wifi_driver;

(2)填充该设备的usb_driver结构体成员变量。代码如下:
static struct usb_driver xxx_usb_wifi_driver = {
.name = "XXX_USB_WIFI",
.probe= xxx_probe,
.disconnect= xxx_disconnect,
.suspend= xxx_suspend,
.resume= xxx_resume,
.id_table= xxx_table,
};

(3)将该驱动注册到USB子系统。代码如下:
usb_register(&xxx_usb_wifi_driver);

以上步骤只是一个大致的USB驱动框架流程,而最大和最复杂的工作是填充usb_driver结构体成员变量。以上步骤的主要工作是将USB接口的WIFI设备挂载到USB总线上,以便Linux系统在USB总线上就能够找到该设备。

2、接下来是网络设备的线索,网络设备驱动大致步骤如下:

(1)定义一个net_device结构体变量ndev。代码如下:
struct net_device *ndev;

(2)初始化ndev变量并分配内存。代码如下:
ndev=alloc_etherdev();

(3)填充ndev -> netdev_ops结构体成员变量。代码如下:
static const struct net_device_ops xxx_netdev_ops= {
.ndo_init= xxx_ndev_init,
.ndo_uninit= xxx _ndev_uninit,
.ndo_open= netdev_open,
.ndo_stop= netdev_close,
.ndo_start_xmit= xxx_xmit_entry,
.ndo_set_mac_address= xxx_net_set_mac_address,
.ndo_get_stats= xxx_net_get_stats,
.ndo_do_ioctl= xxx_ioctl,
};

(4)填充ndev->wireless_handlers结构体成员变量,该变量是无线扩展功能。代码如下:
ndev->wireless_handlers = (struct iw_handler_def *)&xxx_handlers_def;

(5)将ndev设备注册到网络子系统。代码如下:
register_netdev(ndev);

3、WiFi设备本身私有的功能及属性,如自身的配置及初始化、建立与用户空间的交互接口、自身功能的实现等。

(1)自身的配置及初始化。代码如下:
xxx_read_chip_info();
xxx_chip_configure();
xxx_hal_init();

(2)主要是在proc和sys文件系统上建立与用户空间的交互接口。代码如下:
xxx_drv_proc_init();
xxx_ndev_notifier_register();

(3)自身功能的实现,在前面已经讲解过WiFi的网络及接入原理,如扫描等。同时由于WiFi在移动设备中,相对功耗比较大,因此,对于功耗、电源管理也会在驱动中体现。

转自: 嵌入式资讯精选

围观 641

智能家电并不是单指某一个家电,而应是一个技术系统,其中,无线通信技术则成为了家电智能化的基石,市面上智能家电采用较多的无线技术基本采用ZigBee、红外、蓝牙、Wi-Fi以及射频这五种无线通讯技术,今天就由笔者来跟大家普及这五种无线技术。

1、Zigbee

一般来说,采用Zigbee技术的智能家电控制系统包括Zigbee协调器、ZigBee红外控制终端和家庭网关。Zigbee网络中有两种功能模块,一种是Zigbee协调器,对Zigbee网络进行建立和管理;另一种是Zigbee终端节点,主要完成Zigbee网络的加入和对学习型红外遥控模块的控制。Zigbee的协调器通过RS232串口可以与家庭网关进行数据交互,实现无线控制网络与控制主机的连接。

2、红外

外红传输,对于传统家电来说,基本上采用的都是红外传输,随着家电智能化的发展,大到冰箱,小到插座,一瞬间所有电器似乎都贴上了智能化的标签。红外也是实现家电智能化升级的一种方式,主要依靠无线红外转发器来完成。无线红外转发器是一款内置红外和收发模块,具备红外信号的学习与记忆功能,可学习、记忆多台红外设备的智能产品。它可将收发模块、ZigBee无线信号与红外无线信号关联起来,通过移动智能终端来控制任何使用红外遥控器的家用设备,通过无线红外转发器,用户可用任何手机上的智能家居应用APP,对多个电器设备进行遥控,实现集多种红外遥控器功能于一体。

3、蓝牙

蓝牙能够让终端主动地发布、获取和处理信息,随着蓝牙的发展,可以把所有的蓝牙信息家电通过一个遥控器来进行控制,甚至可以在这些蓝牙信息家电之间共享有用的信息。蓝牙模块是利用无线蓝牙技术进行蓝牙传输的一种模块,蓝牙模块对外联络网络环境,对内联络操作系统,在智能家电系统上发挥非常重要的作用,其发展进程亦受到业内高度关注。智能家电市场需求量不断增长,同时蓝牙模块市场需求量也正在飞速增长。

4、Wi-Fi

目前市面上大部分的智能家居产品都是基于Wi-Fi无线物联网技术,以实现对家电设备的智能控制。其主要工作原理为:通过用户自身手机发出程序指令,家中值守的系统模块接收到信息后对信息进行适当的处理,然后把处理结果通过Wi-Fi传递到单片机上,这样单片机就可以根据信息做出相应的控制指令,以完成用户发出的控制命令,同时,还将最终处理结果反馈给客户端。客户端需要完成的功能主要是家电智能控制,即客户端通过Wi-Fi网络向服务器端发送控制信息,再由服务器端将信息返回到客户端。

5、射频

射频包含RFID射频标签,它是一种非接触式的自动识别技术,通过射频信号识别目标对象并获取相关数据,识别工作无须人工干预,作为条形码的无线版本,RFID技术具有条形码所不具备的防水、防磁、耐高温、使用寿命长、读取距离大、标签上数据可以加密、存储数据容量更大、存储信息更改自如等优点。RFID射频标签被认为将广泛应用于智能冰箱中,最终取代需要在今天使用的条形码。每个RFID标签代表为每个产品设置唯一的编号,而不是一个条形码跟踪产品作为一个整体。可以通过一个RFID阅读器将处理数据通过网络连接,确定产品名称、制造商、有效期和所有其他相关的项目信息。

来源: Woo科技

围观 489

物联网在各个层面都存在严重的安全问题:硬件,软件,网络和终端用户。微软研究院的下一代操作系统技术集团一直负责Sopris项目“探索确保广大低成本的互联网连接设备的联机目标”与。他们分享了他们的第一个技术报告,其中指出“高度安全的设备的七个属性”,并描述了他们在设计基于微控制器的基于Mediatek MT7687 MIPS微控制器的原型设备的实验,并展示了这七个属性。

为改善微控制器的安全性微软与Mediatek合作开发项目Sopris Secure WiFi MCU

实验Sopris开发板

Microsoft团队识别的七个属性包括:

● 基于硬件的信任根 - 由硬件生成和保护的不可伪造的加密密钥。物理对策抵御旁路攻击。
● 小可信计算基础 - 存储在受硬件保护的保管库中的私钥,软件无法访问。软件分为自我保护层。
● 深度防御 - 针对每个威胁应用的多重缓解。对策减轻了成功攻击任何一个向量的后果。
● 区域化 - 软件组件之间的硬件执行障碍阻止了其中的一个漏洞传播给他人。
● 基于证书的认证 - 通过不可伪造的加密密钥证明的签名证书证明了设备身份和真实性。
● 可再生安全 - 续订使设备转向安全状态,并撤销已知漏洞或安全漏洞的受损资产。
● 故障报告 - 由基于云的故障分析系统报告软件故障,如攻击者探测安全性导致的缓冲区超载。
● 在注意到大多数传统MCU缺少所有这7个属性后,他们决定修改Mediatek MT7687,其框图如下所示:

为改善微控制器的安全性微软与Mediatek合作开发项目Sopris Secure WiFi MCU

并用微软称之为“Pluton安全子系统”的密码引擎和硬件RNG替代了内存管理单元(MMU)以及更多的片上SRAM。一个这样做,他们整合在这个帖子顶部的图片中的原型图片。

为改善微控制器的安全性微软与Mediatek合作开发项目Sopris Secure WiFi MCU

Sopris WiFI MCU框图

所以现在我们有一个高度安全的支持WiFi的MCU。由于我们正在谈论安全和WiFi,作为一个快速端点,现在可以利用Broadcom WiFi SoC安全漏洞访问Android设备中的主机操作系统。这不会影响Sopris MCU。

据说Sopris开发板支持七个属性:

● 基于硬件的信任根 - 设备秘密在Pluton安全子系统中受到保护。
● 小型可信计算基础 - 对于大多数操作,Sopris的TCB与Pluton安全子系统隔离。
● Sopris支持深度防御 - 升级后的CPU与Pluton安全系统之间的高达7层防御。
● 隔离区 - 例如,单独的隔间可以使用升级的CPU启用的隔离地址空间来实现。
● 基于证书的身份验证 - 例如,存储在Pluton安全子系统中的私钥可以形成安全的每个设备证书链的基础。
● 可再生的安全性 - 例如,在Sopris上运行的软件堆栈可以深入地使用多层硬件保护的防御来实现可再生
安全。
● 故障报告 - 例如,在Sopris上运行的故障处理代码可以收集有关故障的数据,并通过Wi-Fi将该信息中继到故障分析服务。

展望未来,微软研究人员计划将Sopris整合到一个简单的设备板设计中,其软件可与学术界和行业的研究人员和安全专家共享。

来源:电子工程师时间

围观 424
订阅 RSS - WiFi