记录《用于物联网Arduino 项目开发实用案例解析》第七章 物联网模式:点播客户端的实践过程(没有用ios,采用android)

一、Apache服务器部分

1.安装WampServer3.0,其中apache2.4.17……见下图

本机127.0.0.1,或者192.168.31.154都可以打开。但同一局域网的其他电脑没法打开(浏览器访问报的一直是403 Forbidden,报 You don't have permission to access / ……on this server错误),需要修改apache的配置文件。

(1)apache2.2版本

打开apache配置文件httpd.conf,找到这么一段:

Options FollowSymLinks

AllowOverride None

Order deny,allow

deny from all

Satisfy all

然后试着把deny from all中的deny改成了allow,保存后重起了apache,然后再一测试我的网页,哈哈!居然问题就出在这,访问测试网站完全正常了。

(2)apache2.4版本

2.4+中是把Order deny,allow Deny from all两项合并为Require all denied的。好那么现在我将Require all denied改为允许状态Require all granted就ok了。

DocumentRoot "c:/wamp64/www/"

Options Indexes FollowSymLinks

AllowOverride none

Require all granted

二、Mysql数据库部分

WAMP安装好后,在cmd中输入mysql -h 127.0.0.1 -u root -p 19***2,就可以登录mysql数据库客户端了(root用户的密码我之前改为自己的了,初始默认为空)。show databases;查看当前系统中共有多少个数据库。use dbofcumtzd1020;使用之前建立的一个数据库。

select database();显示当前使用的是那个数据库。然后按教程方法创建parking_spots_data表并插入一条数据。

三、PHP部分(代码都放在C:\wamp64\www\smartparking文件夹中)

1.util_dbconn.php,教程中的连接方法不能用,改用mysqli_connect()函数。

connect_error) {

die("[ERROR] Connection Failed:".$mysqli->connect_error);

}

?>

2.update.php

query($sql)) {

# code...

echo "[error]".mysqli_error()."\n";

exit();

}

$mysqli->close();

echo "[debug] Update Parking Spots Counter Successfully\n";

?>

3.getcount.php(教程中的$result->相关函数及属性不能用)

0) {

# code...

$row=mysqli_fetch_assoc($result);

print(json_encode($row));

//echo $row["COUNT"];

} else {

# code...

echo "0 results";

}

$mysqli->close();

?>

四、Arduino部分

#include #include //1.网络连接所需变量及函数

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress staticIP(192, 168, 31, 159);

EthernetClient client;

const int ledPin = 3;

long int lastMsg = 0;

int tryTimes = 1;

void connectToInternet()

{

//最初使用的是以下注释的代码,DHCP第一次一般都连不上,静态ip连接的一般都不能用

/*if (Ethernet.begin(mac) == 0)

{

Serial.print("[ERROR] Failed to Configure Ethernet using DHCP");

Ethernet.begin(mac, staticIP);

}*/

//最终用多次连接实现DHCP,试5次,不行再静态连接,一般3次就连上了

while (Ethernet.begin(mac) == 0 && tryTimes <= 5)

{

Serial.print("[ERROR] Failed to Configure Ethernet using DHCP ");

Serial.print(tryTimes);

Serial.println("times,Try again 5s later;");

tryTimes = tryTimes + 1;

delay(5000);

}

//静态连接Ethernet.begin(mac, staticIP)的返回值是void,没法判断连接的是否合理,留疑???

if (tryTimes >= 6) {

Ethernet.begin(mac, staticIP);

}

Serial.println("[INFO] Connection Successsful");

Serial.println("");

printConnectionInformation();

Serial.println("-------------------------");

Serial.println("");

}

void printConnectionInformation()

{

Serial.print("[INFO] IP Address: ");

Serial.println(Ethernet.localIP());

Serial.print("[INFO] Subnet Mask: ");

Serial.println(Ethernet.subnetMask());

Serial.print("[INFO] Gateway: ");

Serial.println(Ethernet.gatewayIP());

Serial.print("[INFO] DNS: ");

Serial.println(Ethernet.dnsServerIP());

}

//3.读取传感器数据变量及函数

int calibrationTime = 30;

#define TRIGPIN 2

#define ECHOPIN 3

void calibrateSensor()

{

Serial.println("[INFO]Calibrating Sensor");

for (int i = 0; i < calibrationTime; i++)

{

Serial.print(".");

delay(1000);

}

Serial.println("");

Serial.println("[INFO]Calibration Complete");

Serial.println("[INFO]Sensor Active");

delay(50);

}

void readSensorData()

{

//产生一个检查物体的脉冲

digitalWrite(TRIGPIN, LOW);

delayMicroseconds(10);

digitalWrite(TRIGPIN, HIGH);

delayMicroseconds(10);

digitalWrite(TRIGPIN, LOW);

//计算距离

float distance = pulseIn(ECHOPIN, HIGH) / 58.0;

Serial.println("[INFO]Object Distance: " + String(distance));

if (distance < 50) {

Serial.println("[INFO]Parking spot occupied");

publishSensorData("OCCUPIED");

} else {

Serial.println("[INFO]Parking spot OPEN");

publishSensorData("OPEN");

}

}

//2.通过HTTP发布数据

char server[] = {"192.168.31.154"};

int port = 80;

unsigned long lastConnectionTime = 0;

const unsigned long postingInterval = 10L * 1000L;

void publishSensorData(String updateParkingSpot) {

while (client.available()) {

char c = client.read();

Serial.write(c);

}

if (millis() - lastConnectionTime > postingInterval) {

client.stop();

Serial.println("[INFO]Connecting to Server");

String requestData = "parkingUpdate=" + updateParkingSpot;

if (client.connect(server,port)) {

Serial.println("[INFO]Server Connected - HTTP GET Started");

client.println("GET /smartparking/update.php?" + requestData + " HTTP/1.1");

client.println("Host: " + String(server));

client.println("Connection:close");

client.println();

lastConnectionTime = millis();

Serial.println("[INFO]HTTP GET Completed");

} else {

Serial.println("[INFO]Connection Failed");

}

}

Serial.println("---------------------------------------");

}

void setup() {

Serial.begin(9600);

pinMode(TRIGPIN, OUTPUT);

pinMode(ECHOPIN, INPUT);

connectToInternet();

calibrateSensor();

}

void loop() {

readSensorData();

delay(5000);

}

五、Android部分

1.APP/build.gradle

dependencies {

compile fileTree(dir: 'libs', include: ['*.jar'])

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {

exclude group: 'com.android.support', module: 'support-annotations'

})

compile 'com.android.support:appcompat-v7:24.2.1'

testCompile 'junit:junit:4.12'

compile "com.squareup.okhttp3:okhttp:3.4.1"

compile "com.google.code.gson:gson:2.7"

}

2.activity_main.xml

3.MainActivity.java(使用okhttp进行http连接,使用gson解析返回的JSON格式数据)

package com.lxm.smartparking;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

import com.google.gson.Gson;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;

import java.io.IOException;

import okhttp3.OkHttpClient;

import okhttp3.Request;

import okhttp3.Response;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private static final String TAG = "MainActivity";

TextView responseText;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button sendRequest = (Button) findViewById(R.id.send_request);

responseText = (TextView) findViewById(R.id.reponse_text);

sendRequest.setOnClickListener(this);

}

@Override

public void onClick(View v) {

if (v.getId()==R.id.send_request) {

sendRequestWithOkhttp();

}

}

private void sendRequestWithOkhttp(){

new Thread(new Runnable() {

@Override

public void run() {

try {

OkHttpClient client=new OkHttpClient();

Request request=new Request.Builder()

.url("http://192.168.31.154/smartparking/getcount.php")

.build();

//url()中不加http:还不行,报错!!

Response response=client.newCall(request).execute();

String responseData=response.body().string();

parseJSONWithGSON(responseData);

} catch (IOException e) {

e.printStackTrace();

}

}

}).start();

}

private void showResponse(final String response) {

runOnUiThread(new Runnable() {

@Override

public void run() {

responseText.setText(response);

}

});

}

private void parseJSONWithGSON(String jsonData) {

//方法二:采用Gson解析JSON数据

Gson gson =new Gson();

Car_Num car_num=gson.fromJson(jsonData,Car_Num.class);

final String count=car_num.getCount();

Log.i(TAG, "parseJSONWithGSON: "+jsonData);

Log.i(TAG, "parseJSONWithGSON: "+count);

showResponse(count);

//方法一:采用JSONObject解析,因为jsonData为字符串{"COUNT":"0"},报错说无法转换为JSONArray

/*try {

JSONArray jsonArray = new JSONArray(jsonData);

for (int i=0;i

4.Car_Num.java

package com.lxm.smartparking;

/**

* Created by lxm on 2018/12/28.

*/

public class Car_Num {

private String COUNT;

public String getCount() {

return COUNT;

}

public void setCount(String count) {

this.COUNT = count;

}

}

5.在AndroidManifest.xml中加入英特网权限

心得:整个系统反应很流畅,一是arduino定时采集距离信息,将信息通过http的get方法发送给apache服务器端的php后台程序update.php,php解析get得到的数据更新mysql数据库。二是Android程序也通过http方法访问apache服务器端的php后台程序getcount.php,该程序查询mysql中的相关信息后以JSON格式数据返回给Android程序,Android解析返回的数据后在界面上更新。

可以用浏览器组装get方法来调用php程序更新数据库

1.http://192.168.31.154/smartparking/update.php?parkingUpdate=OPEN

2.http://192.168.31.154/smartparking/getcount.php

getcount php,物联网方案之“Android+Apache服务器(PHP+Mysql)+Arduino(+以太网盾板)”(四.点播客户端)...相关推荐

  1. 《微信小程序案例10》后端服务器与mysql数据库与前端微信小程序

    一.服务器配置mysql 1.下载数据库模块,直接在egg服务器里面下载:npm i --save egg-mysql 2.vscode打开服务器文件夹config里面的plugin.js ,开启刚刚 ...

  2. 基于STM32C8T6、ESP8266-01S、JavaWeb、JSP、Html、JavaScript、Android、服务器和客户端设计、上位机和下位机设计等技术融合的物联网智能监控系统设计与实现

    系列文章目录 第一章ESP8266的java软件仿真测试 第二章ESP8266硬件与软件测试 第三章ESP8266客户端与Java后台服务器联调 第四章ESP8266客户端与JavaWeb服务器联调 ...

  3. [Android study note]安装Apache服务器

    本文转自:http://blog.csdn.net/qpc908694753/article/details/55058161 (一)apache官网下载Apache HTTP Server服务器 我 ...

  4. Apache服务器访问过慢分析及解决

    起因:线上的一台服务器,最近总是出现 访问 很慢的情况发生,点击一个链接要2秒钟以上才能打开,按照我们对于访问人数的估计,服务器应该不至于响应这么慢,从而需要针对这个问题进行分析,来解决网站访问过慢. ...

  5. 配置apache服务器的文件名,apache服务器配置文件名是

    apache服务器配置文件名是 内容精选 换一换 方法一:在VSCode上选择"文件 > 首选项 > 设置",再选择"工作区",并在输入框搜索&qu ...

  6. 新年第一天,3000台Apache服务器宕机

    [编者按]新婚现场给服务器扩容,下班路上修Bug--对于程序员来说,这样的日常并不陌生.在新年第一天,国外一名叫Ali Josie 的软件工程师.信息安全爱好者就经历了找Bug.复现.修复这样的事情, ...

  7. Linux环境下搭建Apache服务器(完整版)

    Linux下搭建Apache服务器(完整版) 什么是Apache? Apache Licence是著名的非盈利开源组织Apache采用的协议.该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权, ...

  8. 联发科全网通MT6755核心板资料,MT6755芯片模块物联网方案

    MT6755核心板 全网通8核联发科MTK6755核心板MT6755主板物联网方案LTE模块 CPU:MediaTek MT6755 架构:ARM Cortex-A53 八核2.0GHz 操作系统:A ...

  9. 教你怎样来优化Apache服务器的性能

    测试和提高性能 Apache 服务器 已经被设计得尽可能的快,即使你用一台配置不高的机器,用不着进行太复杂的设置,它的响应内容就足以塞满以前的各种窄带连接但随网站WebSite内容日益复杂和带宽的增加 ...

最新文章

  1. 依赖注入?依赖注入是如何实现解耦的?
  2. 画原理图和PCB图该注意什么?
  3. oracle易忘函数用法(1)
  4. 慧联A8最新检测使用教程V2.0.3
  5. [Ext JS6实战]动态数据绑定
  6. vue 实现文件下载
  7. Java中的优先队列——二叉堆
  8. ORACLE表空间查看和扩展
  9. Java测试驱动开发(TDD)
  10. AlphaGo浅析——浅析卷积神经网络
  11. 药品名自动归类机器人(化药_中成药_中药材)
  12. ini更改文件夹图标
  13. 苹果笔记本显卡性能测试软件,苹果Mac Pro性能测试:好厉害的“垃圾桶”
  14. Python——pyqt5的计算器(源码+打包)
  15. 怎么设置计算机桌面壁纸,电脑桌面壁纸怎么设置?
  16. 惠普计算机不启动不了系统还原,惠普电脑win10进不了系统怎么恢复系统
  17. 重磅!李沐「动手学深度学习」中文课程笔记来了!
  18. 孙陶然:协同是现场最高级别干部的责任
  19. 数学建模--数学规划模型Python实现
  20. 通信原理及系统系列29——基于Matlab自动增益控制(AGC)算法分析1

热门文章

  1. 将汉字转换为拼音:pypinyin.pinyin()
  2. 【图像处理笔记】图像分割之聚类和超像素
  3. 读书笔记-干法-人生三毒
  4. 部分经济学术语英文简写
  5. 中民协元宇宙工委承办|2022年世界互联网大会乌镇峰会元宇宙主题咖荟
  6. apache2 不解析php,apache2不解析php怎么办
  7. 百度地图SDK for Android【覆盖物】
  8. 安卓上哔哩哔哩视频的导出
  9. 谷歌浏览器打印不弹出预览直接打印机打印的方法
  10. shell脚本--三种引号的区别