假装是个引言


去年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相关推荐

  1. 程序员面试前只因为做了这几件事,成功征服了一系列大厂面试官。

    这篇文章适用于所有需要就业的小伙伴,不管你是名校毕业,还是双非出身,我相信这篇文章能给你带来一点点的小的收获! 我们先来了解这篇文章的主要脉络: 一份引人注目的简历 求职的各个关键时间点 投递简历的正 ...

  2. 人机对话这件事为什么难?| 清华x-lab人工智能研习社

    关注52AI,做AI的行业领先者.QQ人工智能行业交流群:626784247. 01 "目前市面上人机交互的智能硬件,距离真正的自然交互依然有很长的一段路要走." 在清华x-lab ...

  3. 关于拿蓝桥杯省一这件事

    关于我拿蓝桥杯省一这件事 我呢,拿了蓝桥杯c/c++省一等奖,我知道,这是一个对于很多人来说微不足道的一个奖项,但这也是我现在唯一的竞赛奖项,参加过acm直接败北,只有这个蓝桥杯还带有一丝丝的温暖. ...

  4. 手机被偷前必做两件事

    [转载:http://www.williamlong.info/archives/4765.html] 很多"专家"都曾经发过<手机被偷后必做的N件事>这类教程,比如: ...

  5. 安装Linux后我做的几件事

    安装Linux后我都做了哪些事? Author:StruggleYang by:elementary OS/Atom 在使用了一段时间的Linux后,前前后后安装也有几十次,也犯过一些致命的错误,为了 ...

  6. 安装linux要用英文版,安装Ubuntu 15.10英文版之后要做的五件事

    15.10 版 Ubuntu 在界面上其实没有什么大的变化.如果是重新安装,而且安装时保持了默认的英语.没有联网.没有安装第三方应用的话,还得需要进行一些必要的设置,使之更加方便日常使用. 1.连接互 ...

  7. [译文] 程序员的禅修之路 走出浮躁的泥沼:把一件事做到某种境界

    http://www.nowamagic.net/librarys/veda/detail/2436 文章转自上述网址 做一名禅修程序员意味着什么?那意味着,你要持守我从禅宗 习得的10条戒律,它们与 ...

  8. 说到“以用户为中心”这件事,Aruba很专业!

    最近,小编在采访中听到了一件很有意思的事儿. 还记得上大学的时候,几乎所有的老师都会遇到同样一个问题:学生在上课的时候经常性联网玩手机却不认真听课. 对此,老师们很苦恼,一度觉得这就是教室内设置的WI ...

  9. 在卖咖啡这件事上,究竟怎样才是“新零售”

    在新零售之风吹遍各行各业的今天,凡是卖东西的,如果不跟这个新名词搭上点儿关系仿佛就已经落后于时代.落后于时代的后果是什么? 东西卖不出去呗. 新零售的形式有很多种,其涉及到线上线下.物流快递.门店科技 ...

最新文章

  1. html5与原生混合模式开发,HTML5与混合模式开发与Native的关系及其实现[张振华.Jack].pdf...
  2. 你未必知道的CSS故事:揭开leading的面纱
  3. Palo Doris不会用?(基础指南)
  4. Xftp连接linux(ubuntu)时提示ssh服务器拒绝了密码,请再试一次
  5. windbg 符号表
  6. HDMI光端机是什么?hdmi光端机产品参数及性能特点介绍
  7. Android的JNI【实战教程】4⃣️--C调用Java代码
  8. 有哪些没有时长限制的网课录屏软件?
  9. lammps建模_LAMMPS之Moltemplate建模教程
  10. 记账小程序php开发_微信小程序(应用号)开发实战记账软件实例
  11. 尚硅谷Maven2022----②单一架构案例
  12. 异地恋的自愈系小故事:企鹅先生和北极熊小姐
  13. Markdown 新手指南
  14. 树莓派与GPS模块的那些事儿
  15. 学会买机票 (太有用了)
  16. photoshopcs6 安装
  17. 超详细Redis入门教程!
  18. Linux九阴真经之九阴白骨爪残卷12(日志功能)
  19. 2021-07-28嵌入式学习---驱动
  20. MATLAB处理OBJ模型

热门文章

  1. C/C++常见面试知识点总结附面试真题----20220326更新
  2. C语言VRAM字符串平滑移动,航空数字化仪表中动画显示技术的应用
  3. 在网上看别人去韩国的日记
  4. 漫画:二分解题模板(第一讲)- 修订版
  5. matlab中cond为啥比bet好,matlab用于超短脉冲中啁啾与色散概念的理解
  6. 运动搜索算法之钻石搜索
  7. 大二逃课总结的1.2w字的计算机网络知识!扫盲!
  8. windows下使用nvm管理node版本
  9. 2018 Google 开发者大会终于来了!
  10. Bzoj1823 [JSOI2010]满汉全席