目录
定义一些静态变量
// 在这里都定义成全局的 一般都定义成静态的
private static MqttClient mqttClient; // mqtt客户端
private static string mqttServer = "121.37.84.114"; // mqtt服务器地址
private static string mqttClientId = "frank_writer"; // 客户端id 随便写
private static string SubscribedTopic = "fb5756"; // 订阅主题
//连接数据库字符串
private static string connectionString = "Data Source=MOGFPLQEEJOTGON\\SQLEXPRESS;Initial Catalog=frank;User ID=frank;Password=root123";
// JObject用来生成一个JSON对象,简单来说就是生成”{}”,
// JArray用来生成一个JSON数组,也就是”[]”,
// JProperty用来生成一个JSON数据,格式为key/value的值,
// 而JValue则直接生成一个JSON值
private static JObject jsonObject; //
private Timer timer;// 添加一个定时器
定时器事件的处理器
private void File_access_date(object sender, EventArgs e) {
//public MqttClient(string brokerHostName, int brokerPort, bool secure, X509Certificate caCert);
// 四个参数 服务器ip 端口号 不需要 网络传输证书
mqttClient = new MqttClient(mqttServer, 1883, false, null); // 连接服务器
// 给客户端订阅数据 添加事件执行器
mqttClient.MqttMsgPublishReceived += MqttClient_MqttMsgPublishReceived;// 给mqtt添加事件执行器
mqttClient.Connect(mqttClientId); // 添加连接服务的id
// 订阅主题,连接质量为2 ,这个两个数组目前就两个参数
mqttClient.Subscribe(new string[] { SubscribedTopic }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
}
订阅数据的执行器
// 事件具体处理器,处理具体读取的数据
private static void MqttClient_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
{
// Handle the message, e.g., write to SQL 获取json格式的数据
string message = System.Text.Encoding.UTF8.GetString(e.Message);
//MessageBox.Show("Subscribed to " + e.Message); 查看内容
WriteToDatabase(message);// 写到数据库里面
}
处理json格式数据和将处理好的数据添加到数据库中
private static void WriteToDatabase(string data)
{
// sql语句
string sql = "INSERT INTO FLF800(REG001,REG002,REG003,REG004,REG005,REG006,REG007) VALUES (@REG001,@REG002,@REG003,@REG004,@REG005,@REG006,@REG007) ";
string newDate = data.Replace("08", ""); //去掉多余的字符
string endDate = newDate.Replace("-","");//去掉'-'字符
JObject jsonObject = JObject.Parse(endDate);// 将字符串重新转为JSON格式的数据
string senserDatas = jsonObject["sensorDatas"].ToString();//获取json数据的第一个元素
// 转为json数据,转之前数据格式必须是一样的不可以又多余的格式,不然就会报错
JArray jsonArray = JArray.Parse(senserDatas); // 将json其转化为数据
int sum = jsonArray.Count; // 获取数据的大小
Dictionary<string, string> dictionary = new Dictionary<string, string>();// 字典来存储数据
//
for (int i = 0; sum > 0;i++)
{
jsonObject = jsonArray[i] as JObject;// 将每一个json元素重新转为json对象
dictionary.Add(jsonObject["flag"].ToString(), jsonObject["value"].ToString());
sum--;
}
//power = JsonConvert.DeserializeObject<PowerData>(endDate);
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@REG001", dictionary["REG001"]);
cmd.Parameters.AddWithValue("@REG002", dictionary["REG002"]);
cmd.Parameters.AddWithValue("@REG003", dictionary["REG003"]);
cmd.Parameters.AddWithValue("@REG004", dictionary["REG004"]);
cmd.Parameters.AddWithValue("@REG005", dictionary["REG005"]);
cmd.Parameters.AddWithValue("@REG006", dictionary["REG0061"]);
cmd.Parameters.AddWithValue("@REG007", dictionary["REG0062"]);
cmd.ExecuteNonQuery();
}
}
//MessageBox.Show("数据添加成功");
}
要求和最终效果
总结一下
// JObject用来生成一个JSON对象,简单来说就是生成”{}”,
调用静态方法,重新变成json对象
JObject jsonObject = JObject.Parse(endDate);// 将字符串重新转为JSON格式的数据
string senserDatas = jsonObject["sensorDatas"].ToString();//获取json数据的第一个元素
// JArray用来生成一个JSON数组,也就是”[]”,
// 转为json数据,转之前数据格式必须是一样的不可以又多余的格式,不然就会报错
JArray jsonArray = JArray.Parse(senserDatas); // 将json其转化为数据
int sum = jsonArray.Count; // 获取数据的大小
// 这两个没有用到,但在百度上查到了,在这里也提一下
// JProperty用来生成一个JSON数据,格式为key/value的值,
// 而JValue则直接生成一个JSON值