Windows Mobile
Verwendung von GPS und Web Maps für Anwendungen mit Standorterkennung
Christopher Mitchell
Codedownload verfügbar in der MSDN-Codegalerie
Code online durchsuchen
Themen in diesem Artikel:
|
In diesem Artikel werden folgende Technologien verwendet: Windows Mobile 6, MapPoint |
Inhalt
Verwenden von MapPoint für die Standortfunktionalität
Aufgaben und Pocket Outlook
Anwendungsarchitektur
Abrufen nahe gelegener Punkte
Hinzufügen von Aufgaben
Ausblick
Ich bin kürzlich in ein neues Haus gezogen, und einige nette Freunde verbrachten einen ganzen Tag damit, mir beim Packen und Auspacken von Kisten zu helfen, beim Einrichten von Anschlüssen sowie bei allen anderen wichtigen, aber mühsamen Aufgaben, die bei einem Umzug anfallen. Auf dem Rückweg nach dem Abholen der letzten Kiste aus meinem alten Haus vergaß ich beinahe, das Abendessen für meine Freunde mitzubringen. Ich hatte in meinem Windows Mobile-Telefon eine Erinnerung erstellt, aber das Telefon konnte mir nicht mitteilen, wann genau ich am günstigsten Restaurant mit Straßenverkauf vorbeifuhr.
Die Lösung, die ich brauchte, war ein Telefon, das mich darüber informieren würde, wenn ich mich in der Nähe des Platzes befinde, an dem ich die gestellte Aufgabe erledigen kann. Eine Zeit und Standort berücksichtigende Erinnerung würde uns erlauben, einfach das mitgenommene Essen zu genießen, statt in einer unbekannten Gegend herumzufahren, nachdem wir einen ganzen Tag Kisten herumgeschleppt haben.
Windows Mobile bietet viele Schnittstellen und Features, die dabei helfen können, das Gerät über seine Umgebung auf dem Laufenden zu halten – wo es sich befindet, ob es ein Signal empfängt, wie stark das Signal ist und so weiter. Wie können diese Features aber in Ihren Anwendungen verwendet werden? Die bekannteste und wohl nützlichste dieser Funktionen ist die Standorterkennung. Dies sollte Ihnen ermöglichen, Anwendungen mit Standorterkennung zu entwickeln, die von ziemlich offensichtlichen Satellitennavigationsprogrammen bis hin zur viel raffinierteren Aufgabenliste reichen, die hier vorgestellt wird.
In diesem Artikel werden Probleme erörtert, die beim Verwenden dieser Funktion entstehen, und es wird der zusätzliche Code untersucht, den Sie beim Entwickeln nützlicher Anwendungen schreiben müssen. In diesem Artikel werde ich die Entwicklungsumgebung und die Dienstprogramme für mobile Anwendungen erläutern und Ihnen zeigen, wie Sie eine Aufgabenlistenanwendung mit Standorterkennung entwickeln, die Sie am richtigen Ort und zur richtigen Zeit an eine Aufgabe erinnert.
Verwenden von MapPoint für die Standortfunktionalität
Meine Aufgabenlistenanwendung mit Standorterkennung namens „Wheretodo“ muss mehrere Kernaufgaben durchführen. Sie muss Informationen über den geografischen Standort des Telefons abrufen. Außerdem muss sie Aufgaben speichern und überwachen. Darüber hinaus muss die Anwendung wissen, welche Geschäfte und Dienstleistungsunternehmen in der Nähe des Standorts, an dem sich das Telefon gerade befindet, zur Verfügung stehen und zur Lösung einer aktuellen Aufgabe verwendet werden können. Schließlich muss sie Benachrichtigungen an das Telefon senden. Die Schnittstelle der Anwendung ist in Abbildung 1 dargestellt.
Abbildung 1 Anwendung „Wheretodo“
Als Erstes benötigt die Anwendung geografische Daten. Für den Zweck dieses Artikels habe ich mich für den Microsoft MapPoint-Webdienst entschieden. Dieser Webdienst ist die zugrunde liegende Technologie für Live Search Maps und Virtual Earth und bietet einen Umgebungssuchdienst für Europa und die USA. In dem hier dargestellten Beispielcode werden die Einstellungen für europäische Kartendaten verwendet. Sie werden ihn ändern müssen, damit er woanders funktioniert.
Für bestimmte Typen von Geschäften verwendet MapPoint GPS-Breiten- und Längengrade sowie Suchcodes als Argumente. Die Positionsinformationen können vom FakeGPS-Dienstprogramm zur Verfügung gestellt werden, wenn es auf einem Emulator oder Smartphone installiert ist. (Weitere Informationen zu diesem Dienstprogramm finden Sie in der Randleiste „FakeGPS“.)
MapPoint stellt einen XML-Webdienst mit SOAP-API zur Verfügung. Dieser Webdienst ist in vier Hauptdienste aufgeteilt: einen gemeinsamen Dienst, einen Suchdienst, einen Renderdienst und einen Routendienst. Für diese Anwendung ist der Suchdienst am interessantesten, aber wenn Sie dem Benutzer Richtungen oder eine Karte vorgeben wollten, könnten Sie zum Erweitern der Funktionen die anderen Dienste verwenden.
Der gemeinsame Dienst (CommonServiceSoap) enthält Klassen, Methoden und Eigenschaften, die den Such-, Routen- und Renderdiensten gemein sind oder grundlegende Hilfsfunktionen darstellen.
Sie können den Suchdienst (FindServiceSoap) verwenden, um Adressen, geografische Entitäten, Breiten- und Längengradkoordinaten sowie interessante Punkte (points of interest, POIs) in den Daten des MapPoint-Webdiensts zu finden. Sie können auch Adressen analysieren und Standortdaten für angegebene Breiten- und Längengrade zurückgeben.
Sie können den Renderdienst (RenderServiceSoap) verwenden, um Routen- und Standortkarten zu zeichnen, Pins zu setzen, Polygonbereiche zu zeichnen, Kartengröße und Kartenansicht festzulegen, Punkte auf einer Karte auszuwählen, Standortinformationen zu Punkten und Polygonen auf einer Karte abzurufen und eine gerenderte Karte zu schwenken und zu zoomen.
Der Routendienst (RouteServiceSoap) generiert Routen, Fahrtrichtungen und berechnete Routendarstellungen (er wird zum Rendern einer hervorgehobenen Route auf der Karte verwendet) basierend auf Standorten oder Zwischenstopps, legt Segment- und Routeneinstellungen fest und generiert Kartenansichten von Segmenten und Richtungen.
Eine breite Palette an Objektmodell-Klassendiagrammen ist auf MSDN zu finden. MapPoint enthält die für die Such-, Routen- und Renderdienste verwendeten Daten in unterschiedlichen Datenquellen in Abhängigkeit von der geografischen Region oder dem benötigten Informationstyp. Auf MSDN finden Sie eine umfassende Palette an technischen MapPoint-Artikeln über die Verwendung des Diensts.
Aufgaben und Pocket Outlook
Das Pocket Outlook-Objektmodell (POOM) ermöglicht Ihnen, Menüs und Funktionalitäten in die Aufgaben- und Kontaktanwendungen in Windows Mobile einzufügen und die zugehörigen Elemente und Daten zu ändern. Es gibt drei Hauptschnittstellen, die für eine Anwendung mit Standorterkennung von Interesse sind: IAppointment, ITask und IContact.
IAppointment repräsentiert einen Termin im Ordner „Kalender“. Ein Terminobjekt kann eine Besprechung, einen einmaligen Termin oder wiederkehrende Termine bzw. Besprechungen darstellen.
ITask repräsentiert zugewiesene, delegierte oder selbst zugewiesene Aufgaben, die innerhalb eines vorgegebenen Zeitrahmens durchgeführt werden müssen. Aufgabenelemente sind im Ordner „Aufgabe“ enthalten.
IContact repräsentiert einen Kontakt im Ordner „Kontakt“. Dessen Methoden können zum Speichern, Löschen, Duplizieren oder Anzeigen eines Kontakts verwendet werden. Die IPOutlookItemCollection-Schnittstelle kann zum Hinzufügen neuer Kontakte oder zum Abrufen bereits vorhandener verwendet werden.
In der Beispielanwendung wird ITask verwendet. (Aus funktionaler Sicht könnte IAppointment verwendet werden, aber diese Schnittstelle ist nicht so gut für die unmittelbaren Anforderungen der Anwendung geeignet.) Das POOM entspricht dem Outlook-Objektmodell auf dem Desktop. Weitere Informationen finden Sie auf MSDN im Artikel Unterschiede zwischen dem Pocket Outlook-Objektmodell und dem Outlook-Objektmodell.
Anwendungsarchitektur
Die Anwendung mit Standorterkennung besteht aus zwei Funktionsketten. Die erste Kette ist das System, das die aktuellen Aufgaben und Probleme überwacht, wie in Abbildung 2 dargestellt. Aufgaben werden in einer SQL Server-Compact-Datenbanktabelle gespeichert. Zusätzlich wird ein Satz an Hilfsdaten in einer weiteren Tabelle namens „Geocache“ gespeichert. Das Verwenden der separaten Tabelle ist ein Mittel zum Begrenzen der erforderlichen Konnektivität, wie ich später in diesem Artikel erläutern werde.
Abbildung 2 Überwachen von und Benachrichtigen über Aufgaben mit Standorterkennung
Die Informationen über die nahe gelegenen Punkte werden vom Microsoft MapPoint-Webdienst zur Verfügung gestellt. Es gibt verschiedene Datenquellen im MapPoint-Webdienst für verschiedene Teile der Welt, und einige davon haben mehr Funktionen als andere. Die Datenquelle, die von der Beispielanwendung verwendet wird, ist NavTech.EU. Nachdem diese Informationen gesammelt wurden, können bei Bedarf einige Entfernungsberechnungen durchgeführt und Benachrichtigungen ausgegeben werden.
Die zweite Ereigniskette (siehe Abbildung 3) fügt der Aufgabenliste auf Ihrem Windows Mobile-Gerät über das POOM Aufgaben hinzu. Dieses Framework ermöglicht auch den Zugriff auf die Kalender- und SMS-Funktionen.
Abbildung 3 Systemfluss für das Hinzufügen von Aufgaben zur Wheretodo-Anwendung
Aufgaben und Cache repräsentieren den ersten Teil der Überwachungs- und Benachrichtigungskette der Ereignisse. Der Task-Manager ruft einfach eine Aufgabenliste vom POOM ab. Er verwaltet auch Geocache, das die Probleme beim Verwenden von Webdiensten auf Geräten mit potentiell begrenzter Konnektivität behandelt. Die Konnektivitätsebene des Geräts kann von „permanenter Konnektivität“ bis „teilweise verbunden“ oder „überhaupt keine Verbindung“ reichen.
Um ganz unterschiedliche Konnektivitätsstärken zu bewältigen, benötigen Sie eine ordentliche Cacherichtlinie für Webdienstdaten und ein unkompliziertes System, das weiß, wie die Konnektivität am besten ausgenutzt werden kann. Obwohl problemlos sehr komplexe Szenarios vorstellbar sind, wurde für den Zweck dieses Artikels eine einfache Radiuscacherichtlinie eingerichtet. Beispielsweise wird eine Abfrage an den MapPoint-Webdienst gesendet, mit der alle chinesischen Restaurant mit Straßenverkauf, die innerhalb eines vorgegebenen Radius, z. B. 80 km, vom aktuellen Standort liegen, gefunden werden sollen. Sobald Sie 40 km in eine Richtung gegangen sind, wird eine neue Suche ausgelöst. Dies basiert auf dem Prinzip, dass jede Abfrage an den Webdienst kostspielig ist.
Es wird ebenfalls angenommen, dass die Entfernung, die Sie von dem Punkt aus zurücklegen, an dem Sie die Aufgabe eingegeben haben, wahrscheinlich nicht größer als 40 km sein wird. Da die zum Kontrollieren der Cacheaktionen verwendete Entfernung sich wahrscheinlich von Person zu Person und von Land zu Land ändern wird, ist sie durch den Benutzer einzugeben.
Protokolle zu den Orten, an denen Abfragen bereits durchgeführt wurden, werden in der GeocacheProtokolldatenbank gespeichert und geprüft, bevor weitere Abfragen gesendet werden, damit keine doppelten Informationen vom Webdienst angefordert werden. Weiterhin wird dem System die Möglichkeit geboten, im Voraus gefüllt mit einem beträchtlichen Satz an Informationen zu werden.
FakeGPS
FakeGPS-Anwendung
Das Windows Mobile 6 SDK enthält ein Dienstprogramm namens „FakeGPS“, mit dem Sie Ihre Anwendung mit simulierten GPS-Daten testen können. Informationen zum Installieren und Testen mithilfe von FakeGPS finden Sie im Artikel Verwenden des FakeGPS-Dienstprogramms in der MSDN-Bibliothek.
FakeGPS liest einen vorher aufgezeichneten Satz an GPS-Anweisungen ab. Die GPS-Daten können von einem echten GPS-Gerät mithilfe eines GPS-Datenaufnahmegeräts abgerufen werden. Die sich ergebende Datei wird vom FakeGPS-Gerät gelesen und kann wiederholt ausgeführt werden, wobei zu Testzwecken eine Änderung der Standortdaten simuliert wird. Zum Beispiel habe ich eine Reise um London herum aufgezeichnet, um Daten für meine Anwendung zu sammeln und anschließend die Reise über FakeGPS zu wiederholen.
Abrufen nahe gelegener Punkte
In der nächsten Komponente wird definiert, wie Geocache aufgefüllt wird. Wenn die Anwendung einen Standort finden muss, wird eine GetNearByPOI-Funktion aufgerufen (siehe Abbildung 4). Der Code fragt den MapPoint-Webdienst ab. Beachten Sie, dass der hier dargestellte Code aus Gründen der Übersichtlichkeit vereinfacht wurde und sich von dem im Codedownload unterscheidet.
Abbildung 4 Abrufen nahe gelegener interessanter Punkte
private void GetNearByPOI(
string KeyWord, LatLong CurrentPosition) {
FindServiceSoap findService = new FindServiceSoap();
FindNearbySpecification findNearBySpec = new FindNearbySpecification();
findService.Credentials =
new System.Net.NetworkCredential(myUserName, myPassword);
findService.PreAuthenticate = true;
findNearBySpec.Distance = Convert.ToDouble(inputdistance.Text);
findNearBySpec.LatLong = new LatLong();
findNearBySpec.LatLong.Latitude = CurrentPosition.Latitude;
findNearBySpec.LatLong.Longitude = CurrentPosition.Longitude;
findNearBySpec.Filter = new FindFilter();
//findNearBySpec.Filter.EntityTypeName = KeyWord;
findNearBySpec.Filter.EntityTypeName = "FoodType3"; // SIC CODE
findNearBySpec.DataSourceName = "NavTech.EU";
FindResults foundResults;
foundResults = findService.FindNearby(findNearBySpec);
string connectionString;
string fileName = System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) +
"\\wheretodo.sdf";
string password = "sa";
connectionString = string.Format("DataSource=\"{0}\"; Password='{1}'",
fileName, password);
SqlCeConnection cn = new SqlCeConnection(connectionString);
cn.Open();
SqlCeCommand cmd;
//Loop Round and add it to the geocache
foreach (FindResult fr in foundResults.Results) {
//This needs to include LongLat in geocache
string sql =
"insert into geocache2 (POI_Name, POI_Address, POI_Tel, POI_Web, " +
"POI_POST_ZIP, POI_Lat, POI_Long, POI_KeyWord) " +
"values (@Name, @Address, @Tel, @Web, @POST_ZIP, '" +
fr.FoundLocation.LatLong.Latitude.ToString() +
"', '" + fr.FoundLocation.LatLong.Longitude.ToString() + "', '" +
KeyWord.ToString() + "')";
cmd = new SqlCeCommand(sql, cn);
cmd.Parameters.Add("@Name", SqlDbType.NVarChar, 255, "Name").Value =
fr.FoundLocation.Entity.Properties[0].Value.ToString();
cmd.Parameters.Add("@Address", SqlDbType.NVarChar, 255, "Address").Value =
fr.FoundLocation.Entity.Properties[1].Value.ToString() +
fr.FoundLocation.Entity.Properties[2].Value.ToString();
cmd.Parameters.Add("@Tel", SqlDbType.NVarChar, 255, "Tel").Value =
fr.FoundLocation.Entity.Properties[9].Value.ToString();
cmd.Parameters.Add("@Web", SqlDbType.NVarChar, 255, "Web").Value =
"http://m.live.com";
cmd.Parameters.Add("@POST_ZIP", SqlDbType.NVarChar, 255, "POST_ZIP").Value =
fr.FoundLocation.Entity.Properties[7].Value.ToString();
cmd.ExecuteNonQuery();
//Update geocachelog
sql = "insert into GeoCodeLog (Keyword, Lat, Long ) values ('" + KeyWord +
"', '" + fr.FoundLocation.LatLong.Latitude.ToString() + "', '" +
fr.FoundLocation.LatLong.Longitude.ToString() + "' )";
cmd = new SqlCeCommand(sql, cn);
cmd.ExecuteNonQuery();
}
}
Schauen Sie sich den Abschnitt an, in dem CurrentPosition.Latitude und CurrentPosition.Longitude aufgerufen werden. Dies wird letztlich von GPS Intermediate Driver abgeleitet, einer Softwareschicht, die sich zwischen den Anwendungen und dem Gerätetreiber für GPS-Hardware befindet. Diese Abstraktionsschicht ermöglicht, dass Anwendungen einmal geschrieben werden und danach in der Lage sind, mit mehreren GPS-Geräten zu arbeiten. Die GPS Intermediate Driver-API wird über eine systemeigene Codebibliothek verfügbar gemacht. Sie können auf diese Bibliothek mit verwaltetem Code mithilfe der Beispieldaten, die im Windows Mobile 6 Professional SDK enthalten sind, zugreifen (siehe Verwenden des GPS Intermediate Driver über verwalteten Code).
Sobald Sie den aktuellen Standort und den nahe gelegenen interessanten Punkt haben, die für diese Aufgabe relevant sind (hier durch die in der Navtech.EU-Datenquelle verwendeten NACE-Codes identifiziert), müssen Sie genau bestimmen, wie weit diese Punkte von Ihrem aktuellen Standort entfernt sind. Ich habe die vom Webdienst und von GPS zurückgegebenen Längen- und Breitengradwerte (in diesem Fall FakeGPS) verwendet. In Abbildung 5 ist dargestellt, wie ich diese Werte in Entfernungen konvertiert habe.
Abbildung 5 Berechnen der Entfernung
private double GetLatLongTuppleDistance(
double Lat1, double Long1, double Lat2, double Long2) {
//Convert Degress to Radians for Calculations
double Lat1r = ConvertDegreesToRadians(Lat1);
double Lat2r = ConvertDegreesToRadians(Lat2);
double Long1r = ConvertDegreesToRadians(Long1);
double Long2r = ConvertDegreesToRadians(Long2);
// Spherical law of cosines formula—ignores the effect of hills
double R = 6371; // Earth's radius (km)
double d = Math.Acos(Math.Sin(Lat1r) * Math.Sin(Lat2r) +
Math.Cos(Lat1r) * Math.Cos(Lat2r) *
Math.Cos(Long2r—Long1r)) * R;
//Returns distances in km
return d;
}
Eine sphärische Trigonometriefunktion, die auf dem sphärischen Kosinussatz basiert (was eine Verallgemeinerung des Satzes des Pythagoras darstellt), stellt die Funktion zur Verfügung, die Breiten- und Längengradpaare in Entfernungen (in km) übersetzt. Dies macht offensichtlich einige schwerwiegende Annahmen über die Dinge, die Sie von dem Standort trennen, den Sie zu finden versuchen. Da die Erde keine perfekte Kugel ist, treten beim Verwenden dieser Formeln Fehler auf. Zum Berechnen der Meilen müssten Sie 1 km durch 1,609344 dividieren, und falls Sie kurz mit Ihrem Boot Brot holen möchten, dividieren Sie zum Berechnen der Seemeilen durch 1,852.
Der letzte Teil dieser Ereigniskette besteht darin, eine Benachrichtigung an den Benutzer zu senden, sobald eine Lösung für seine Aufgabe innerhalb einer bestimmten Entfernung vom aktuellen Standort gefunden wurde. Da diese Entfernung durch Transportmittel beeinflusst wird – Auto, Fußweg, Fahrrad usw. –, wurde dies als Eingabewert für den Benutzer belassen.
Hinzufügen von Aufgaben
Bevor ein Standort von der Anwendung gefunden werden kann, muss der Benutzer selbstverständlich zunächst Aufgaben in das mobile Gerät eingeben. Das POOM spiegelt das Outlook-Objektmodell, aber sein Funktionalitätsbereich ist verringert, um praktischen Einschränkungen mobiler Geräte Rechnung zu tragen.
Mithilfe des POOM ist es ziemlich einfach, Termin-, Aufgaben- und Kontaktelemente zu ändern und anzuzeigen, sowie die Ordner zu ändern, in denen sie enthalten sind. Hier ist der Code zum Erstellen eines Aufgabenelements:
OutlookSession outlooksession = new OutlookSession();
Task NewTask = new Task();
NewTask.Body = textBox2.Text.ToString();
string MyString = dateTimePicker2.Value.ToShortDateString() + " " + dateTimePicker1.Text.ToString();
DateTime MyDateTime = new DateTime();
MyDateTime = DateTime.ParseExact(MyString, "M/d/yy h:mm:ss tt", null);
NewTask.DueDate = MyDateTime.ToUniversalTime();
NewTask.Subject = textBox1.Text.ToString();
outlooksession.Tasks.Items.Add(NewTask);
Verschiedene Parameter können verändert werden, um das Enddatum und den Aufgabentext festzulegen und sie anschließend in dem POOM hinzuzufügen.
Diese Komponente macht die letzte der beiden Komponentenketten aus, die dazu verwendet werden, die Funktionalität der Wheretodo-Anwendung zur Verfügung zu stellen. Die Benutzeroberfläche des Systems selbst ist sehr einfach und stellt Mittel zur Verfügung, alle relevanten Informationen sowie die NACE-Codes, die die Anwendung suchen wird, festzulegen. Die Gesamtanwendung ist einfach in eine unendliche Schleife verpackt, um die Verwendung von Anwendungen mit Standorterkennung zu veranschaulichen. Sie könnten sie problemlos als Hintergrunddienst in Ihr mobiles Gerät einfügen, um es effizienter und sauberer in die Windows Mobile 6- oder die Windows Mobile 5-Umgebung zu integrieren.
Mobile Datenressourcen
Einmaliges Schreiben von Code für mobile Anwendungen und für Desktopanwendungen
Unterwegs: Anpassungsfähige Anwendungen für Windows Mobile
Datenpunkte: Zugriff auf Daten über eine mobile Anwendung
Ausblick
Ihnen wurden ein Gerät mit Standorterkennung und ein Tool, das die Entwicklung dieser Anwendungen erleichtert, vorgestellt. Das Grundkonzept einer Aufgabenliste mit Standorterkennung könnte problemlos für RFID erweitert werden.
An diesem Code, der für jede Anwendung mit Standorterkennung gilt, können Verbesserungen vorgenommen werden. Diese betreffen insbesondere die Frage, wie die Standorterkennung mit anderen kontextbewussten Diensten verbunden ist, die auf den meisten Mobiltelefonen ausgeführt werden. Für die Aufgaben ist nicht ersichtlich, was Sie sonst zu tun versuchen, sondern nur Ihr Standort. Ihre Aufgaben sollten möglicherweise auf beides abzielen, sowohl auf eine Zeit als auch auf einen Standort, damit sie ausgelöst werden, sobald Sie sich zu einem bestimmten Zeitpunkt in der Nähe eines bestimmten Orts befinden (etwa auf der Fahrt von der Arbeit nach Hause). Noch besser wäre es, wenn die Aufgabenerinnerung wissen würde, dass für Sie eine Besprechung in 10 Minuten ansteht und dass Sie nicht genug Zeit haben, um Briefmarken zu holen, obwohl sich das Postamt sogar auf dem Weg zur Besprechung befindet.
Wenn Sie daran interessiert sind, ein benutzerdefiniertes Installationsprogramm hierfür oder für Ihre eigene gerade aktualisierte Anwendung mit Standorterkennung zu erstellen, lesen Sie meinen Artikel Anpassen der Klingellautstärke an Umgebungsgeräusche im MSDN Magazin vom Oktober 2007.
Diesen Artikel möchte ich Tom Passey widmen, einem lieben Freund, der sich bei vielen Gelegenheiten zusammen mit seiner Ehefrau um mich gekümmert und mir damit wunderbare Erinnerungen beschert hat. Ich wünsche Ihnen nur das Beste.
Christopher Mitchell erwarb seinen PhD in Computerlernen und in der Signalverarbeitung von Musik/Ton, war ein Kauffman/NCGE-Fellow und arbeitet derzeit als Unternehmensgründer in Cambridge, Großbritannien. Er ist Teilzeitdozent an der Anglia Ruskin University in Cambridge, Großbritannien. Sie erreichen Chris Mitchell unter chris.mitchell@anglia.ac.uk.