关于HML要玩物联网这件事 之 CC3200 TCP Client
假装是个引言
去年TI难得发了次大福利,圣诞节派送CC3200开发板。本辣鸡博主抢得早,加上没落C9.edu.cn 邮箱加持,抽奖居然抽中了。TI不论是赞助竞赛还是送板子,目的都很明确,就是想推广自己的东西。你们看,自从TI垄断电赛之后,全国高校都在设计TM4C的开发板和应用软件了吧!(参加了最后一届瑞萨杯的博主发出了银铃般的笑声^_^)
(这就是博主抽中的CC3200开发板)
但不用TM4C,拿了人家的CC3200,就是嫌弃TI库函数难用,也不能把它扔到闲鱼上对不对?嗯,还要为TI着想,能开发应用就开发应用,开发不了应用写写教程,教程都不会写也该写点笔记对不对?所以无能博主来写小笔记了~
现在开始说正事:这篇博客只是一个应用笔记,我不会太多讨论原理。大家玩单片机应该都有经验,先把东西跑起来再研究。另外,虽然我之前的博客都是有关Java,但我声明我对Java并不非常了解,我主要还是玩单片机和电路。。。
服务器架设
其实平时要玩,在家/宿舍拿台电脑当服务器,和cc3200连进同一个无线路由的局域网就可以了。但正好博主最近买了VPS,闲着不用也无聊,拿来当个服务器倒很合适,虽然要忍受的网络时延。反正玩嘛,适当高配没问题。
我的服务器端装着Python2.7。我个人是更喜欢Python3的,但似乎后端中Python2还比较多。我打算服务器端就干一件很无聊的事情:收到报文之后,回复一个当前时间。我的具体代码参考了Kurose和Ross那本《计算机网络:自顶向下方法》中的代码。这段代码比较简单,而且Python本来就利于理解,我就不加注释了。只是说明,我的端口是1996,服务器端会看到用户发来的信息。
# TCPServerEx.py
from socket import *
from datetime import *
import timedef GetDate():today = date.today()return str(today.year)+'-'+str(today.month)+'-'+str(today.day)def GetTime(currentTime):totalSecond = int(currentTime)currentSecond = totalSecond % 60currentMinute = totalSecond // 60currentHour = currentMinute // 60 % 24currentMinute %= 60if currentSecond<10:sSec = '0'+str(currentSecond)else:sSec = str(currentSecond)if currentMinute<10:sMin = '0'+str(currentMinute)else:sMin = str(currentMinute)if currentHour<10:sHor = '0'+str(currentHour)else:sHor = str(currentHour)return (sHor+':'+sMin+':'+sSec)def main():serverPort =1996serverSocket = socket(AF_INET, SOCK_STREAM)serverSocket.bind(('',serverPort))serverSocket.listen(3)print 'This server is ready to receive'while True:connectionSocket, addr = serverSocket.accept()message = connectionSocket.recv(1024)print 'Receive From:' + str(addr)print message.decode()strTime =GetDate()+', ' + GetTime(time.time())connectionSocket.send(strTime.encode())print 'Send message:' + strTimeconnectionSocket.close()main()
这样写好之后,在服务器上运行,如下图所示,输出一行This server is ready to receive,这样服务器端就准备好了。
其实服务器不用这么早开,等单片机编程好再开也不迟。
CC3200 SimpleLink 的TCP Client编程
接下来我们就要对CC3200编程了。我是在TI给的CC3200SDK例程中编写的,现在应该很少有人徒手造轮子吧。在例程中有一个“TCP Socket”,是TCP协议例程。刚刚我在服务器上也是开TCP,虽然一般这种少量信息的通信,用UDP也许更好。
我用TI自家的CCS,要编译好CC3200的例程,必须把例程目录下driverlib和simpleLink两个工程一起放在Workspace编译才行。过去我受STM32那种工程相对独立的设计的影响,调这个调了一天才终于把例程编译过。在我们做电赛时,TI这种复杂封装确实是相当累赘的,因为那时候我们实际上还是很底层,直接在电路上工作的,封装太麻烦让我们反而对电路丧失感觉。但像CC3200这样的“Wi-Fi® 和 IoT 解决方案”,编程其实有些高级了,脱离硬件是很必要的。
我们看到我们用到了simpleLink库。这是ti设计的一套无线连接库,我也是刚入门,不敢评说,只是按ti的说法,这个库非常容易。对于互联网这么复杂的东西,恰当的封装总是受欢迎的。
先把TCP Socket例程编译一遍,确认编译能通过,所有该有的库都加进来了,然后改参数:
// #define IP_ADDR 0xc0a8006E /* 192.168.0.110 */
#define IP_ADDR 我的服务器IP
// #define PORT_NUM 5001
#define PORT_NUM 1996
// #define BUF_SIZE 1400
#define BUF_SIZE 32
// #define TCP_PACKET_COUNT 1000
#define TCP_PACKET_COUNT 1
这段代码是例程中有关通信对象的信息和发包数量信息。注释掉的是原来的代码。我不打算发多少数据,服务器代码的服务方式是,收到一个包,也发回一个包。
这个例程中,CC3200既可以当服务器(Server),也可以当客户端(Client)。其中,做客户端的代码由一个函数
int BsdTcpClient(unsigned short usPort);
所定义。其他的代码我们大可不必关心,都和无线连接有关。原先的代码中,只管发包,不管回复信息,我对此做了修改:
int BsdTcpClient(unsigned short usPort)
{int iCounter;short sTestBufLen;SlSockAddrIn_t sAddr;int iAddrSize;int iSockID;int iStatus;long lLoopCount = 0;// filling the buffer // for (iCounter=0 ; iCounter<BUF_SIZE ; iCounter++)// {// g_cBsdBuf[iCounter] = (char)(iCounter % 10);// }// 准备发送数据 Hello HMLg_cBsdBuf[0] = 'H';g_cBsdBuf[1] = 'e';g_cBsdBuf[2] = 'l';g_cBsdBuf[3] = 'l';g_cBsdBuf[4] = 'o';g_cBsdBuf[5] = ' ';g_cBsdBuf[6] = 'H';g_cBsdBuf[7] = 'M';g_cBsdBuf[8] = 'L';g_cBsdBuf[9] = '\n';for (iCounter=10;iCounter<BUF_SIZE;iCounter++){g_cBsdBuf[iCounter]=0;}
#define SEND_SIZE 10sTestBufLen = BUF_SIZE;//filling the TCP server socket addresssAddr.sin_family = SL_AF_INET;sAddr.sin_port = sl_Htons((unsigned short)usPort);sAddr.sin_addr.s_addr = sl_Htonl((unsigned int)g_ulDestinationIp);iAddrSize = sizeof(SlSockAddrIn_t);// creating a TCP socketiSockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0);if( iSockID < 0 ){ASSERT_ON_ERROR(SOCKET_CREATE_ERROR);}// connecting to TCP serveriStatus = sl_Connect(iSockID, ( SlSockAddr_t *)&sAddr, iAddrSize);if( iStatus < 0 ){// errorsl_Close(iSockID); ASSERT_ON_ERROR(CONNECT_ERROR);}// sending multiple packets to the TCP serverwhile (lLoopCount < g_ulPacketCount){// sending packetiStatus = sl_Send(iSockID, g_cBsdBuf, SEND_SIZE, 0 );if( iStatus < 0 ){// errorsl_Close(iSockID);ASSERT_ON_ERROR(SEND_ERROR);}// 如果能到这里,就说明成功连接了Server// 这样调用simpleLink的sl_Recv函数就可以接收服务器数据iStatus = sl_Recv(iSockID, g_cBsdBuf, sTestBufLen, 0 );if( iStatus < 0 ){// errorsl_Close(iSockID);ASSERT_ON_ERROR(RECV_ERROR);}else{ // 没有错误的话,把收到的数据从串口发回UART_PRINT(g_cBsdBuf);}lLoopCount++;}Report("\n\r\n\rSent %u packets successfully\n\r",g_ulPacketCount);iStatus = sl_Close(iSockID);//closing the socket after sending 1000 packetsASSERT_ON_ERROR(iStatus);return SUCCESS;
}
我们还需要修改例程中一个细节:CC3200是WiFi芯片,我们要设置连接哪个WiFi。我在图书馆游击的时候完成实验的,用手机开了热点,这种方式比较方便(我们图书馆无线上网需要开网页认证,单片机终究做不到)。设置接入AP在例程中common/common.h里,原来是这样:
#define SSID_NAME "cc3200demo" /* AP SSID */
#define SECURITY_TYPE SL_SEC_TYPE_WPA /* Security type (OPEN or WEP or WPA*/
#define SECURITY_KEY "12345678" /* Password of the secured AP */
修改成我们自己的路由器就好了。
运行结果
单片机还是连在电脑上的,板载FT2232,在线调试的同时支持了串口。单片机启动并连入WiFi(涉及可能泄露隐私的信息都被抹去):
选择1发送数据,也就是做TCP Client,同时打开XShell看接收端:
右边XShell 在服务器上收到了“Hello HML”,左边单片机收到了时间“2018-3-16, 08:49:20”(格林威治时间)。CC3200单片机成功和互联网上的服务器相互通信了,今天又是收获满满的一天了^_^
关于HML要玩物联网这件事 之 CC3200 TCP Client相关推荐
- 程序员面试前只因为做了这几件事,成功征服了一系列大厂面试官。
这篇文章适用于所有需要就业的小伙伴,不管你是名校毕业,还是双非出身,我相信这篇文章能给你带来一点点的小的收获! 我们先来了解这篇文章的主要脉络: 一份引人注目的简历 求职的各个关键时间点 投递简历的正 ...
- 人机对话这件事为什么难?| 清华x-lab人工智能研习社
关注52AI,做AI的行业领先者.QQ人工智能行业交流群:626784247. 01 "目前市面上人机交互的智能硬件,距离真正的自然交互依然有很长的一段路要走." 在清华x-lab ...
- 关于拿蓝桥杯省一这件事
关于我拿蓝桥杯省一这件事 我呢,拿了蓝桥杯c/c++省一等奖,我知道,这是一个对于很多人来说微不足道的一个奖项,但这也是我现在唯一的竞赛奖项,参加过acm直接败北,只有这个蓝桥杯还带有一丝丝的温暖. ...
- 手机被偷前必做两件事
[转载:http://www.williamlong.info/archives/4765.html] 很多"专家"都曾经发过<手机被偷后必做的N件事>这类教程,比如: ...
- 安装Linux后我做的几件事
安装Linux后我都做了哪些事? Author:StruggleYang by:elementary OS/Atom 在使用了一段时间的Linux后,前前后后安装也有几十次,也犯过一些致命的错误,为了 ...
- 安装linux要用英文版,安装Ubuntu 15.10英文版之后要做的五件事
15.10 版 Ubuntu 在界面上其实没有什么大的变化.如果是重新安装,而且安装时保持了默认的英语.没有联网.没有安装第三方应用的话,还得需要进行一些必要的设置,使之更加方便日常使用. 1.连接互 ...
- [译文] 程序员的禅修之路 走出浮躁的泥沼:把一件事做到某种境界
http://www.nowamagic.net/librarys/veda/detail/2436 文章转自上述网址 做一名禅修程序员意味着什么?那意味着,你要持守我从禅宗 习得的10条戒律,它们与 ...
- 说到“以用户为中心”这件事,Aruba很专业!
最近,小编在采访中听到了一件很有意思的事儿. 还记得上大学的时候,几乎所有的老师都会遇到同样一个问题:学生在上课的时候经常性联网玩手机却不认真听课. 对此,老师们很苦恼,一度觉得这就是教室内设置的WI ...
- 在卖咖啡这件事上,究竟怎样才是“新零售”
在新零售之风吹遍各行各业的今天,凡是卖东西的,如果不跟这个新名词搭上点儿关系仿佛就已经落后于时代.落后于时代的后果是什么? 东西卖不出去呗. 新零售的形式有很多种,其涉及到线上线下.物流快递.门店科技 ...
最新文章
- html5与原生混合模式开发,HTML5与混合模式开发与Native的关系及其实现[张振华.Jack].pdf...
- 你未必知道的CSS故事:揭开leading的面纱
- Palo Doris不会用?(基础指南)
- Xftp连接linux(ubuntu)时提示ssh服务器拒绝了密码,请再试一次
- windbg 符号表
- HDMI光端机是什么?hdmi光端机产品参数及性能特点介绍
- Android的JNI【实战教程】4⃣️--C调用Java代码
- 有哪些没有时长限制的网课录屏软件?
- lammps建模_LAMMPS之Moltemplate建模教程
- 记账小程序php开发_微信小程序(应用号)开发实战记账软件实例
- 尚硅谷Maven2022----②单一架构案例
- 异地恋的自愈系小故事:企鹅先生和北极熊小姐
- Markdown 新手指南
- 树莓派与GPS模块的那些事儿
- 学会买机票 (太有用了)
- photoshopcs6 安装
- 超详细Redis入门教程!
- Linux九阴真经之九阴白骨爪残卷12(日志功能)
- 2021-07-28嵌入式学习---驱动
- MATLAB处理OBJ模型