Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

SMS naar MySQL

Pagina: 1
Acties:

  • g4wx3
  • Registratie: April 2007
  • Laatst online: 12-10 08:33
Voor mijn opleiding electronica, heb ik een arduinobordje geconfigureerd dat smsjes stuurt.

Deze worden ontvangen op een computer en moeten worden opgeslaan in een database (MySQL)
In php heb ik nu een frontend geprogrameerd voor de MySQL server.

Voor de backend, had ik totaal geen idee hoe aan te pakken.
We hebben enkel wat embedded C gehad.

Nu heb ik research gedaan, en heb ik alle onderdelen gevonden in C#
Ondertussen Visual Studio Express 2013 geïnstalleerd.

Ik ga dus voor de eerste keer programmeren voor Windows.

De volgende delen heb ik gevonden:

- Ik heb een opensource programma om smsen te lezen - link
- Ik heb een opensource programma om met de database te verbinden - link
- Ik heb code voor een time/clock, die ik wil gebruiken als interval, om de sms uit te lezen en op te slaan. - link

Met bovenstaande moet het mij lukken denk ik om heel snel iets klaar te hebben.
Toch lukt het me niet:

Vraag 1:
- ik heb exact de tutorial gevolgd voor de clock te maken, bij mij werkt het echter niet: timer1_tick wordt nooit aangeroepen.


form1.cs
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Clock
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            label1.Text = DateTime.Now.ToString("HH:mm:ss");

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            label1.Text = DateTime.Now.ToString("HH:mm:ss");
        }
    }
}


form1.designer.cs
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
namespace Clock
{
    partial class Form1
    {

        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.timer1 = new System.Windows.Forms.Timer(this.components);
            this.label1 = new System.Windows.Forms.Label();
            this.SuspendLayout();
            // 
            // timer1
            // 
            this.timer1.Interval = 1;
            this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Font = new System.Drawing.Font("Berlin Sans FB", 27.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.label1.ForeColor = System.Drawing.Color.Blue;
            this.label1.Location = new System.Drawing.Point(238, 98);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(104, 41);
            this.label1.TabIndex = 1;
            this.label1.Text = "label1";
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(570, 261);
            this.Controls.Add(this.label1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.Timer timer1;
        private System.Windows.Forms.Label label1;
    }
}

http://www.softfocus.be/


  • Tharulerz
  • Registratie: April 2009
  • Laatst online: 10-04 05:16
Probeer ook eens je timer te starten ;)

C#:
1
timer1.Start();

In je Form1() constructor

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Of je kijkt even verder dan je neus lang is:

Afbeeldingslocatie: http://tweakers.net/ext/f/gdpK9Mziy5Mt7BlW1xRnmKe4/full.png

Maar wat je natuurlijk in eerste instantie doet is gewoon de documentatie bekijken. Daar zie je dan ook die Enabled property staan (evenals een Start() en Stop() method).

Overigens zijn alle drie de links die je post niet van geweldige kwaliteit (acht, het kan erger, dat ook...). En voor een dergelijk programma zou ik eerder een (windows)service bouwen dan een winforms applicatie. Of een console application die je met de taskscheduler ("cron") om de X tijd een keer aan trapt...

[ Voor 96% gewijzigd door RobIII op 09-05-2014 13:16 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • g4wx3
  • Registratie: April 2007
  • Laatst online: 12-10 08:33
Dankje wel alvast voor jullie snelle antwoord.
Grote dingen kan ik nog vinden, maar kleine dingen zijn zo moeilijk te vinden soms.

Ik besef dat een windows.form niet ideaal is.
Eerst wou ik een C-console programma maken.


Maar heb dat opgegeven. Dat werd veel te complex voor mij.
Dan moest ik handmatig AT-commando's sturen naar de seriele poort van de modem.
Dan had ik nog maar een klein stukje van de software...

http://www.softfocus.be/


  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Hoe verwacht je dat dan in C# te gaan doen? Er zal uiteindelijk toch -iets- met je modem moeten praten..
In C# kan je overigens ook prima consoleapplicaties maken.

  • Pizzalucht
  • Registratie: Januari 2011
  • Laatst online: 08:26

Pizzalucht

Snotneus.

Radiant schreef op vrijdag 09 mei 2014 @ 13:25:
Hoe verwacht je dat dan in C# te gaan doen? Er zal uiteindelijk toch -iets- met je modem moeten praten..
In C# kan je overigens ook prima consoleapplicaties maken.
En een prima Windows service :)

  • g4wx3
  • Registratie: April 2007
  • Laatst online: 12-10 08:33
@ Radiant

het voordeel van form, is dat ik bijv makkelijk een kadertje kan maken om com-poort in te stellen.
De communicatie met de modem wordt gedaan met de library RS232 en GSMcomm.
Er zijn voorbeelden (zoals hierboven) te vinden hoe ik deze moet gebruiken

http://www.softfocus.be/


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Volg mij:
  • Open Visual Studio
  • File -> New Project -> Visual C# -> Console Application (Name: blaat) -> OK
  • Verander je program.cs naar:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;

namespace Blaat
{
    class Program
    {
        static void Main(string[] args)
        {
            string comport = args[0];
            int baudrate = int.Parse(args[1]);

            Console.WriteLine("COM: {0}, BAUD: {1}", comport, baudrate);
        }
    }
}


Et voila. Uw eerste C# console applicatie. Compileren, commandprompt openen en blaat.exe com3 9600 typen (in de juiste (bin) directory). Tadaa. Niks geen inputvenstertjes e.d. nodig.

Natuurlijk is dit wel heel erg kort door de bocht, maar juist Winforms brengt je erg in de verleiding je "businesslogic" te verweven met je "views" (je forms) waardoor je al meteen een valse start maakt.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • zerok
  • Registratie: November 2001
  • Laatst online: 13-11 23:45

zerok

geen

Misschien niet helemaal wat je zoekt maar ik heb dit in het verleden opgelost met een online service bijvoorbeeld telerivet (https://telerivet.com/).

Nodig: 1 oude smartphone met android om de app op te installeren. Deze stuurt de sms'jes naar telerivet. telerivet roept vervolgens een link aan die je zelf kan instellen. Als je al een php script hebt om gegevens in een database te krijgen dan is dit een fix die je in een uurtje ofzo inelkaar hebt zitten.

"never argue with idiots they drag you down to their level and beat you with experience" dilbert


  • g4wx3
  • Registratie: April 2007
  • Laatst online: 12-10 08:33
Ik ben nog steeds aan het programmeren, ik wou dit reeds lang leren.
Ik heb ook nog steeds een winform, maar dat ter zijde.
Ipv AT commands op de com-poort maak ik gebruik van de extrerne library gsmcomm.
AT-commands kunnen nogal tricky zijn.


Na veel knip en plakwerk gedaan ben ik nu zover dat ik connectie heb met de modem, en deze ook kan stoppen, of zelfs automatisch stop als ik de form afsluit.

nu ben ik toch wat in de war met de eventhandlers.

in de handleiding van gsmcomm.dll staat:
C#:
1
public event MessageReceivedEventHandler MessageReceived


Dit staat in de code

C#:
1
2
3
4
5
6
Form1.comm.MessageReceived += new MessageReceivedEventHandler(comm_MessageReceived);

public void comm_MessageReceived(object sender, GsmComm.GsmCommunication.MessageReceivedEventArgs e)
{
       lblstatus.Text = "New message recieved";
}



Form1.comm wordt zo gemaakt
C#:
1
2
3
4
5
public static GsmCommMain comm;

...

Form1.comm = new GsmCommMain(port, baudRate, timeout);


als ik een sms stuur crash het programma
code:
1
2
3
An unhandled exception of type 'System.InvalidOperationException' occurred in mscorlib.dll

Additional information: Cross-thread operation not valid: Control 'lblstatus' accessed from a thread other than the thread it was created on.


Hoe kan ik dit oplossen?

http://www.softfocus.be/


  • decipherer
  • Registratie: Februari 2002
  • Laatst online: 10:15
Je probeert een winforms control aan te passen vanuit een andere thread dan die dat control gemaakt heeft. Dat mag niet, en er is erg veel over te vinden als je op de foutmelding googled, bv: MSDN: How to: Make Thread-Safe Calls to Windows Forms Controls

Het komt er op neer dat je met invoke ervoor kan zorgen dat de call door de juiste thread gedaan wordt.

De beste ideeën komen als je bezig bent.


  • g4wx3
  • Registratie: April 2007
  • Laatst online: 12-10 08:33
Ik heb ondertussen al meer dan 700 regels code + nog eens zo'n 380 regels automatisch gegenereerd door visual studio.

Ik weet niet wat de policy is, maar als het mag, en jullie zijn geintresseerd post ik hier alle code.

Het programma is zo goed als af.
Wat ik nog wil implementeren, is het verzenden van berichten.
Wat ik nog moet implementeren is om berichten te analyseren

http://www.softfocus.be/

Pagina: 1